Common lisp 在Scheme或STk中,函数将显示为过程或闭包,但为什么LISP会给出错误?
在Ubuntu上,如果我运行MIT Scheme,它将以过程的形式显示一个函数:Common lisp 在Scheme或STk中,函数将显示为过程或闭包,但为什么LISP会给出错误?,common-lisp,lisp-2,Common Lisp,Lisp 2,在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 #
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)中,当我做同样的事情时,它反而会给我一个错误,如何将函数显示为值(第一类值/对象)
与Scheme不同,CommonLisp为变量和函数名保留单独的名称空间。在CL中尝试
#'sq
。在google上搜索“Lisp1 vs Lisp2”以获取关于该主题的无休止的长篇大论 显示由命名空间差异引起的Scheme和Common Lisp之间的语法差异。Scheme有一个函数和变量的名称空间。Common Lisp具有不同的函数和变量名称空间。公共Lisp中的名称可以同时具有不同的含义:变量、函数等
功能定义
这些差异不是由命名空间差异引起的
方案:(定义(fooa)(+a1))
通用Lisp:(defun foo(a)(+a1))
将函数对象作为值获取
方案:foo
公共Lisp:(函数foo)
或更短的#'foo
。此表单返回一个函数对象
(let ((bar #'foo))
(funcall bar 10))
调用具有零个或多个参数的函数对象
Scheme:将计算函数表达式的第一个位置
(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))
它起作用了。它将显示
#