2017-06-06 60 views
0

有人可以向我解釋這段代碼的作用和工作原理嗎?常見的LISP代碼說明

(defun f (&optional (x nil) (y (if (atom x) nil (car x)))) 
(cond ((atom x) y) 
     ((< (car x) y) (f (cdr x) y)) 
     (t (f (cdr x) (car x))))) 
+2

如果你不懂語言,你應該閱讀它,瞭解它的語法。這不是這類問題的地方 – gmoshkin

+0

你在代碼中理解了什麼? – coredump

+0

您可以使用['STEP'](http://clhs.lisp.se/Body/m_step.htm)或['TRACE'](http://clhs.lisp.se/Body/m_tracec.htm)看看一個函數是如何工作的。 – Barmar

回答

0

快速運行代碼顯示它是一個函數,它返回給定兩個數字或數字列表的最大數字。如果給出原子,它將返回nil,如果列表中的某個元素不是數字,則返回錯誤。 這裏有一些我得到的結果: CL-USER> (f '(1 2 3 4)) 4 CL-USER> (f '(1 5 2 4)) 5 CL-USER> (f '(1 5 2 4 7)) 7 CL-USER> (f 'y) NIL CL-USER> (f 3 'y) Y A型錯誤出現時,有列表中的一個非數字: CL-USER> (f '(1 x 2 4 7)) 提供了以下錯誤 值 X 的類型是 NUMBER不 當綁定SB-KERNEL :: X [類型TYPE-ERROR的條件]

至於它是如何工作的?該函數比較列表中的數字,第一個參數和數字,第二個參數並返回其中最大的數字。它通過遞歸地比較列表的前兩個數字來完成此操作,將列表中的較大數字與列表的其餘部分進行比較。