我偶然發現瞭解釋Y Combinator的文章this。代碼在Scheme中,但我試圖用Common Lisp來解決它。在Common Lisp變量中定義和使用函數
但是,我無法從Scheme轉換到Common Lisp。 Scheme爲函數和(其他)變量使用單個名稱空間,但Common Lisp爲函數和變量使用不同的名稱空間。我該如何解決這種差異,才能使用Common Lisp代碼?
計劃代碼
以下是教程中的一些Scheme代碼。
在開始時,筆者定義階乘函數:
(define (factorial n)
if (= n 0)
1
(* n (factorial (- n 1)))))
,並將其轉換成這樣:
(define factorial
(lambda (n)
(if (= n 0)
1
(* n (factorial (- n 1))))))
因爲(據筆者),這是計劃做什麼:
計劃只是在評估之前將第一個定義翻譯成第二個定義 。因此Scheme中的所有函數都是lambda 表達式。
Common Lisp的
我試圖重寫既Common Lisp中上述片段模仿從所述第一形式向第二這種轉變。但CL中沒有define
,也沒有一個名稱空間。所以我試圖欺騙我。
重寫Common Lisp中第一個計劃的定義很簡單:
(defun factorial (n)
(if (= n 0)
1
(* n (factorial (- n 1)))))
但(我)這個翻譯成第二個定義是有點棘手。我這樣翻譯它:
(setf (symbol-function 'factorial)
(lambda (n)
(if (= n 0)
1
(* n (factorial (- n 1))))))
這是一個不好的方法來做到這一點(或有更好的辦法)?它似乎工作,但編譯器給我一個樣式警告:未定義的函數:階乘。
我只是學習更好地鍵入自己的代碼,而不是隻讀它。也許在這種情況下,由於Scheme和Common Lisp之間的差異,這不是最好的想法。 – Frank