我开始学习Lisp并使用Lispworks个人版6.1.1,在评估基本功能时遇到了一些问题。我能够在Scheme中得到正确的结果,但当我试图在Lisp中评估它们时,它们却没有工作。
在Lisp中,我知道每个符号都有两个名称空间。所以我试着写一个简单的程序来写两个程序。它在Scheme中运行得很好,但是在Lisp中,评估存在一个问题。
方案中的代码,它工作得很好,并返回2。
(define (comp a b)
(lambda (x)
(a (b x))))
(define test (comp car cdr))
(test '(1 2 3))
在Lisp中重写的相同代码
(defun comp (a b)
(lambda (x)
(funcall a (funcall b x))))
(defun test (comp #'car #'cdr))
(funcall test '(1 2 3))
lispworks中的错误是:
试图绑定一个非符号,
(FUNCTION CAR)
。
因此,当我试图在侦听器中计算(defun test (comp #'car #'cdr))
时,我得到
非符号
(FUNCTION CAR)
在函数TEST
中用作变量名。
我不明白它为什么不这样写。我愿意接受任何帮助
发布于 2019-06-19 00:52:13
defun
用于定义具有参数的函数:
defun function-name lambda-list [[declaration* | documentation]] form*
因此,它需要在函数名之后有一个lambda列表,但是您已经编写了:
(defun test (comp #'car #'cdr))
它不尊重这个语法。如果要定义包含由两个函数组成的函数的变量,则有以下几种可能性:
您甚至可以将其分配给全局函数名,如:
(setf (symbol-function 'test) (comp #'car #'cdr)
在本例中,您可以使用名称作为常规函数名,而不需要funcall
。
(test '(1 2 3))
发布于 2019-06-19 00:51:35
(defun test (comp #'car #'cdr))
DEFUN
期望在名字后面有一个lambda列表,在这里您的lambda列表是格式错误的,因为#'car
不是一个符号,而是读为(function car)
。
您可能想要做的是将函数test
定义为car
和cdr
的组合;(comp ...)
将返回适当的函数对象,但是defun
不允许有一个值来代替lambda列表。
你可以这样做:
(setf (symbol-function 'test)
(comp #'car #'cdr))
发布于 2019-06-19 02:18:13
具有当地职能:
CL-USER 1 > (flet ((comp (a b)
(lambda (x)
(funcall a (funcall b x)))))
(let ((test (comp #'car #'cdr)))
(flet ((test (x)
(funcall test x)))
(test '(1 2 3)))))
2
CL-USER 2 > (labels ((comp (a b)
(lambda (x)
(funcall a (funcall b x))))
(test (x)
(funcall (comp #'car #'cdr) x)))
(test '(1 2 3)))
2
https://stackoverflow.com/questions/56663114
复制