当前位置:  开发笔记 > 运维 > 正文

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

如何解决《在Scheme或STk中,函数将显示为过程或闭包,但为什么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
#[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为变量和函数名称保留了单独的名称空间.试试#'sqCL.同时谷歌周围的'Lisp1 vs Lisp2'在这个问题上的无休止的措辞.



1> pvg..:

与Scheme不同,Common Lisp为变量和函数名称保留了单独的名称空间.试试#'sqCL.同时谷歌周围的'Lisp1 vs Lisp2'在这个问题上的无休止的措辞.



2> Rainer Joswi..:

显示由命名空间差异引起的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))

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有