Создание метода в Common Lisp

#common-lisp #clisp

#common-lisp #clisp

Вопрос:

Привет, я выполняю условие, которое я просто хочу вызвать методом, если условие истинно, проблема в том, что я не могу найти синтаксис, как создать метод в C-Lisp Я новичок в этом языке, вот код.

 /* I want to create a method here which i can all anytime in my condition but I am having problem with a syntax 

 (void method()
   (print "Invalid")
 )

*/

(print "Enter number") 
(setq number(read())
(cond((< 1 number) (print "Okay"))
     ((> 1 number) /*I want to call a method here (the invalid one)*/ )
) 
 

Комментарии:

1. Что void предполагается сделать? См defmethod . Метод defun функции for (не имеет перегрузки типа)

2. Я бы также посоветовал вам изучить систему условий. Вот ссылка, которая поможет вам начать gigamonkeys.com/book /…

3. Комментарий Дэвида касается реальных условий lisp, которые похожи на исключения в других языках, но с большей мощностью. Я полагаю, вы, вероятно, уже знаете язык программирования, возможно, один из языков семейства C. Сложно усвоить свой первый lisp на алголе, поэтому лучше играть в зеленый и сразу перейти к учебнику или книге.

4. Что происходит, когда число равно единице?

5. @Sywester — согласен. OP должен рассмотреть учебник, такой как Practical Commmon Lisp или аналогичный.

Ответ №1:

Для создания функции в common lisp вы можете использовать defun оператор:

 (defun signal-error (msg)
   (error msg))
 

Теперь вы можете вызвать его следующим образом:

 (signal-error "This message will be signalled as the error message")
 

Затем вы можете вставить его в свой код следующим образом:

 (print "Enter number") 
(setq number (read)) ;; <- note that you made a syntax error here.
(cond ((< 1 number) (print "Okay"))
      ((> 1 number) (signal-error "Number is smaller than 1."))))
 

В вашем вопросе вы спрашиваете о method . Методы работают с классами. Например, представьте, что у вас есть два класса human и dog :

 (defclass human () ())
(defclass dog () ())
 

Для создания метода, специфичного для каждого используемого класса defmethod :

 (defmethod greet ((thing human))
  (print "Hi human!"))

(defmethod greet ((thing dog))
  (print "Wolf-wolf dog!"))
 

Давайте создадим два экземпляра для каждого класса:

 (defparameter Anna (make-instance 'human))
(defparameter Rex (make-instance 'dog))
 

Теперь мы можем приветствовать каждое живое существо одним и тем же методом:

 (greet Anna) ;; => "Hi human"
(greet Rex)  ;; => "Wolf-wolf dog!"
 

Процесс определения common lisp, какой метод следует выполнить, называется «Динамической отправкой». В основном он сопоставляет классы данного аргумента с defmethod определениями.

Но я понятия не имею, зачем вам нужны методы в вашем примере кода.

Вот как я бы написал код, если бы я был вами:

 ;; Let's wrap the code in a function so we can call it
;; as much as we want
(defun get-number-from-user ()
  (print "Enter number: ")
  ;; wrapping the number in a lexical scope is a good
  ;; programming style. The number variable is not
  ;; needed outside the function.
  (let ((number (read)))
    ;; Here we check if the number satisfies our condition and
    ;; call this function again if not.
    (cond ((< number 1) (print "Number is less than 1")
                        (get-number-from-user))
          ((> number 1) (print "Ok.")))))
 

Я бы посоветовал вам прочитать «The Land of Lisp». Это отличная книга для начинающих.

Комментарии:

1. Да, но после теста уже есть неявное progn cond значение, поэтому это лишнее. Кроме того, вам может понадобиться a finish-output , чтобы убедиться, что приглашение отображается, прежде чем запрашивать ввод.

2. Спасибо! Полезно также изучать материал, когда вы пытаетесь помочь другим людям изучать материал! Я исправил progn . Теперь я ознакомлюсь с finish-output .

3. Я тоже иногда получаю подобные комментарии, это, безусловно, помогает.

4. Вы имеете в виду defclass и нет class ?

5. Упс. Исправлено.