重复使用匿名函数公共Lisp与Scheme

重复使用匿名函数公共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))) (

我正在研究这个小阴谋家,我正在尝试将所有答案转换成公共Lisp。 第8章讨论了匿名函数以及返回的匿名函数。 例如:

(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