#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
значение, поэтому это лишнее. Кроме того, вам может понадобиться afinish-output
, чтобы убедиться, что приглашение отображается, прежде чем запрашивать ввод.2. Спасибо! Полезно также изучать материал, когда вы пытаетесь помочь другим людям изучать материал! Я исправил
progn
. Теперь я ознакомлюсь сfinish-output
.3. Я тоже иногда получаю подобные комментарии, это, безусловно, помогает.
4. Вы имеете в виду
defclass
и нетclass
?5. Упс. Исправлено.