Common lisp 在Scheme或STk中,函数将显示为过程或闭包,但为什么LISP会给出错误?

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 #

在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)中,当我做同样的事情时,它反而会给我一个错误,如何将函数显示为值(第一类值/对象)


与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))

它起作用了。它将显示
#