方案函数生成器

Scheme Function Maker

我一直在 Scheme(特别是 Pretty Big)中处理这个过程,但遇到了困难。我想要做的是创建一个可以创建其他过程或函数的过程。在大多数情况下,我认为我在正确的轨道上。

(define (function-maker function-specs)

  (let* [(specs (map cdr function-specs))
         (name (caar specs))
         (args (cadr function-specs))
         (body (cdr(cdr function-specs)))]

    (eval(list 'define name
          (list 'lambda args body)))))

当前输出:

以上是当前输出,我将尽我所知解释发生了什么。输入本质上接受三个参数。一个名称,用于命名函数。函数的参数,最后是函数的主体。

然后将三个参数列在一起,然后它应该创建一个新函数。上图显示了我遇到的错误。感谢您的帮助!

要查看发生了什么,删除 eval 并检查列表:

(define (function-maker function-specs)

  (let* [(specs (map cdr function-specs))
         (name (caar specs))
         (args (cadr function-specs))
         (body (cdr(cdr function-specs)))]

    (list 'define name
          (list 'lambda args body))))

> (function-maker '((name: add5) (x) (+ x 5)))
'(define add5 (lambda (x) ((+ x 5))))

如您所见,正文中的括号太多,因此您正试图将结果数字用作过程。

你想要

(body (car (cdr (cdr function-specs))))

(body (caddr function-specs))