scheme - 使用 lisp 中的两个命名空间编写测试函数
问题描述
我开始学习 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
。
我不明白为什么它不能像那样写。我会感谢任何帮助
解决方案
defun
用于定义带参数的函数:
defun function-name lambda-list [[declaration* | documentation]] form*
所以它需要在函数名之后有一个 lambda 列表,但你已经写了:
(defun test (comp #'car #'cdr))
它不尊重这种语法。如果您想定义一个包含由组合两个函数产生的函数的变量,您有几种可能性:
使用特殊变量:
(defvar test (comp #'car #'cdr))
在表单中使用局部变量:
(let ((test (comp #'car #'cdr))) (funcall test '(1 2 3))
您甚至可以将其分配给全局函数名称,例如:
(setf (symbol-function 'test) (comp #'car #'cdr)
在这种情况下,您可以将该名称用作常规函数名称,而无需funcall
:
(test '(1 2 3))
推荐阅读
- sql - PostgreSQL,将数组嵌套到值中
- oracle - 关于连接的技术和语法疑问
- oracle-adf - 清除更改父属性时的依赖属性值
- python-3.x - 提取文件中单词的第一个匹配的 n 个字符
- python - 从实例数组中获取属性数组
- javascript - 在多计划条带订阅中更新单个计划 - WixCode
- ios - fastlane 以错误完成未经授权的访问
- node.js - 在 heroku 上获取对 node.js 中主目录的写访问权限以解决 ResumableUploadError
- generics - 在 Groovy 中实现通用接口
- django - 无法将自定义 AuthenticationForm 与 LoginView 一起使用