2016-10-15 78 views
-4

嗨我正在做一個條件,我只是想調用一個方法,如果條件爲真,問題是我找不到語法如何在C-Lisp中創建方法我是新的這是這個語言的代碼。在Common 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)*/) 
) 
+3

什麼是void應該做的?請參閱'defmethod'獲取函數defun'的方法(沒有類型過載) – Sylwester

+0

我還建議您查看條件系統。這裏是一個鏈接,讓你開始http://gigamonkeys.com/book/beyond-exception-handling-conditions-and-restarts.html#conditions –

+2

戴維斯評論是關於實際的lisp條件,這就像其他語言的例外情況,但擁有更多的權力。我發現你可能已經知道一種編程語言,也許是C族語言之一。很難同化你的第一個lisp algol的知識,所以最好是玩綠色,並立即去教程或書。 – Sylwester

回答

3

要建立在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的問題。方法在類上操作。例如假設你有兩個類humandog

(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語言的土地」。這對初學者來說是一本很棒的書。

+1

是的,但在'cond'測試後已經有一個隱含的'progn',所以這個是多餘的。此外,您可能需要一個「完成輸出」來確保在詢問輸入之前顯示提示。 – coredump

+1

謝謝!當你試圖幫助其他人學習東西時,學習東西也是很好的!我糾正了'progn'。現在我將熟悉'finish-output'。 – tsikov

+0

我有時也會收到這樣的評論,這當然有幫助。 – coredump