在Ubuntu上,如果我运行MIT-Scheme,它将显示一个函数作为一个过程:
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
pvg.. 7
与Scheme不同,Common Lisp为变量和函数名称保留了单独的名称空间.试试#'sq
CL.同时谷歌周围的'Lisp1 vs Lisp2'在这个问题上的无休止的措辞.
与Scheme不同,Common Lisp为变量和函数名称保留了单独的名称空间.试试#'sq
CL.同时谷歌周围的'Lisp1 vs Lisp2'在这个问题上的无休止的措辞.
显示由命名空间差异引起的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
.此表单返回一个函数对象.
调用具有零个或多个参数的函数对象
Scheme:将评估函数表达式的第一个位置.
(let ((bar foo)) (bar 10))
Common Lisp:我们需要用来funcall
调用带参数的函数对象.第一个参数必须是函数对象.
(let ((bar #'foo)) (funcall bar 10))
名称冲突:一个名称空间与两个名称空间
Scheme:需要命名局部变量,以便它们不与定义的函数冲突:
(define (foo lst) (list lst))
Common Lisp:函数和变量之间没有名称冲突.
(defun foo (list) (list list))