2015-12-13 17 views
2

在Ubuntu上,如果我跑MIT-計劃,它會顯示一個功能的程序:在Scheme或STk中,函數將顯示爲過程或閉包,但LISP爲什麼會給出錯誤?

1 ]=> (define (sq x) (* x x)) 

;Value: sq 

1 ]=> (sq 3) 

;Value: 9 

1 ]=> sq 

;Value 11: #[compound-procedure 11 sq] 

和伯克利的STK將顯示sq作爲封閉:

STk> (define (sq x) (* x x)) 
sq 
STk> (sq 3) 
9 
STk> sq 
#[closure arglist=(x) b73fab48] 

爲什麼用Lisp( Common Lisp clisp),當我做同樣的事情時,它會給我一個錯誤,而如何顯示一個函數作爲一個值(第一類值/對象)?

[1]> (defun sq(x) (* x x)) 
SQ 
[2]> (sq 3) 
9 
[3]> sq 

*** - SYSTEM::READ-EVAL-PRINT: variable SQ has no value 
The following restarts are available: 
USE-VALUE  :R1  Input a value to be used instead of SQ. 
STORE-VALUE :R2  Input a new value for SQ. 
ABORT   :R3  Abort main loop 

回答

7

與Scheme不同,Common Lisp爲變量和函數名保留獨立的名稱空間。在CL中嘗試#'sq。此外谷歌的'Lisp1與Lisp2'的主題無盡的言論。

+0

它的工作原理。它會顯示'#' –

7

顯示由名稱空間差異引起的Scheme和Common Lisp之間的語法差異。 Scheme有一個用於函數和變量的命名空間。 Common Lisp對函數和變量有不同的命名空間。 Common Lisp中的名稱可以同時具有不同的含義:變量,函數等等。

函數定義

這些差異不是由命名空間差異引起的。

體系:(define (foo a) (+ a 1))

Common Lisp的:(defun foo (a) (+ a 1))

獲取功能對象作爲值

體系:foo

Common Lisp的:(function foo)或更短#'foo。這個表單返回一個函數對象。

調用帶有零個或多個參數

方案的功能對象:函數式的第一位置進行評價。

(let ((bar foo)) 
    (bar 10)) 

Common Lisp的:我們需要使用funcall調用帶有參數的函數對象。第一個參數必須是函數對象。

(let ((bar #'foo)) 
    (funcall bar 10)) 

名稱衝突:一個命名空間與兩個命名

方案:一個需要,使他們不與定義的函數衝突來命名局部變量:

(define (foo lst) 
    (list lst)) 

的Common Lisp :函數和變量之間沒有名稱衝突。

(defun foo (list) 
    (list list)) 
相關問題