重复使用匿名函数公共Lisp与Scheme
我正在研究这个小阴谋家,我正在尝试将所有答案转换成公共Lisp。 第8章讨论了匿名函数以及返回的匿名函数。 例如:重复使用匿名函数公共Lisp与Scheme,scheme,common-lisp,Scheme,Common Lisp,我正在研究这个小阴谋家,我正在尝试将所有答案转换成公共Lisp。 第8章讨论了匿名函数以及返回的匿名函数。 例如: (define insertL-f (lambda (test?) (lambda (new old l) (cond ((null? l) (quote ())) ((test? (car l) old) (cons new l))) (
(define insertL-f
(lambda (test?)
(lambda (new old l)
(cond
((null? l) (quote ()))
((test? (car l) old) (cons new l)))
(else (cons (car l) ((insertL-f test?) new old (cdr l))))))))
我的代码:
(defun insertL-f (test)
(lambda (new old l)
(cond
((null l) '())
((funcall test (car l) old) (cons new l))
(t (cons (car l) (insertL-f test) new old (cdr l))))))
问题是第二段代码的最后一行。我得到的错误是cons参数太多,但我不能像Scheme代码那样添加额外的一对括号。在Common Lisp中不可能使用这种递归方式吗?insertL-f返回一个函数,在Scheme版本中,如果在CL中使用funcall将列表展平,则应用该函数。但是,要返回的函数似乎与它获取的函数相等,因此可以通过在本地使用标签:
(defun insertL-f (test)
(lambda (new old l)
(cond
((null l) '())
((funcall test (car l) old) (cons new l))
(t (cons (car l)
(funcall (insertL-f test)
new
old
(cdr l)))))))
defun-insert-l-f试验
标签func新旧l
康德
空l'
funcall测试车l旧cons新l
t cons car l func新旧cdr l
"func
在使用local define的方案中也是如此,它实际上是aletrec,语法更为平坦:
定义insert-l-f测试?
定义func新旧l
康德
无效的我引述
测验汽车l旧的cons新的l
否则,车辆会失效,新的旧的cdr l
func
insertL-f返回一个函数,在您的方案版本中,如果使用funcall应用该函数,您可以在CL中应用该函数,但如果使用funcall应用该函数,则会将列表展平。但是,要返回的函数似乎与它获取的函数相等,因此您可以通过使用标签在本地定义该函数来缓存该函数:
defun-insert-l-f试验
标签func新旧l
康德
空l'
funcall测试车l旧cons新l
t cons car l func新旧cdr l
"func
在使用local define的方案中也是如此,它实际上是aletrec,语法更为平坦:
定义insert-l-f测试?
定义func新旧l
康德
无效的我引述
测验汽车l旧的cons新的l
否则,车辆会失效,新的旧的cdr l
func