2016-05-28 110 views
0

我使用CLISP學習Common Lisp的,並已進入下面的代碼:Common Lisp的 - 溫和介紹符號計算:鍛鍊; Tibial 4.4

(defun ordered (x y) 
    (if (< x y) 
     (list x y) 
     (list y x))) 

(setq l (ordered 28 49)) 
(print l) 
(setq l (ordered 49 28)) 
(print l) 

預計這些問題的答案: (28 49) (49 28)

得到這些問題的答案: (28 49) (28 49)

在這本書中的解決方案,我已經找到了相同的函數定義。 什麼可能是錯的?

+0

歡迎堆棧溢出!你看到的結果對我來說是有意義的 - 你能否包括你正在嘗試完成的練習? –

+0

我期待你得到的答案。那是'有序'應該做的,不是? – Svante

+0

練習是如果使用比較子句和兩個結果子句,一個用於比較true和一個用於比較nil(false)。答案1是可以的,因爲28小於49.答案2並不是因爲49不小於28而產生零。結果條款2應該工作併產生(49 28)從未發生過的事情。 – klk2ptx

回答

4

您的代碼

(defun 

定義一個函數,

 ordered 

命名爲 「有序」,

   (x y) 

這預計將被稱爲 「x」 和「兩個參數y「在其主體中,於是在收到參數(即ha ving被稱爲兩個值,例如(ordered 49 28)

(if (< x y) 

它將對它們進行比較,並且如果所述第一比第二較小時,會產生

 (list x y) 

在列表重新包裝(相同的兩個值即'(49 28)); 否則,如果第一個值是小於第二個,

 (list y x))) 

它會產生含有第二值第一列表中,然後將第一個參數值(即'(28 49))。

因此,在這種情況下,比較和?


讀這段代碼一般,我們可以說,如果它收到數爲第一參數,它會產生較小數量第一和更大數量第二,在結果列表;

並且如果它接收到的較小號碼作爲其參數時,會產生較小的數量的第一和較大數目的第二,在結果列表中。

回想一下,我們可以看到,這種描述可以進一步簡化爲一個簡單的陳述:它總是會在結果列表中產生______數字,而______秒數字。


另一種方法來攻擊這個,就是寫下通過定義創建功能,

(lambda (x y) (if (< x y) (list x y) (list y x))) 

然後象徵性地跟隨其應用:

( (lambda (x y) (if (< x y) (list x y) (list y x))) 
    49 
    28 ) 

== 

(let ( (x 49) 
      (y 28) 
    ) 
        (if (< x y) (list x y) (list y x))) 

== 

(let ( (x 49) 
      (y 28) 
    ) 
        (if (< 49 28) (list x y) (list y x))) 

== 

(let ( (x 49) 
      (y 28) 
    ) 
        (if FALSE  (list x y) (list y x))) 

== 

(let ( (x 49) 
      (y 28) 
    ) 
                (list y x) ) 

== 

(let ( (x 49) 
      (y 28) 
    ) 
                (list 28 49)) 

== 

(list 28 49)