要建立在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!"
知道執行哪種方法的通用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.")))))
我建議你閱讀「Lisp語言的土地」。這對初學者來說是一本很棒的書。
什麼是void應該做的?請參閱'defmethod'獲取函數defun'的方法(沒有類型過載) – Sylwester
我還建議您查看條件系統。這裏是一個鏈接,讓你開始http://gigamonkeys.com/book/beyond-exception-handling-conditions-and-restarts.html#conditions –
戴維斯評論是關於實際的lisp條件,這就像其他語言的例外情況,但擁有更多的權力。我發現你可能已經知道一種編程語言,也許是C族語言之一。很難同化你的第一個lisp algol的知識,所以最好是玩綠色,並立即去教程或書。 – Sylwester