Scheme Function Maker

时间:2016-02-15 05:07:19

标签: scheme

我一直在使用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)))))

当前输出:

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

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

1 个答案:

答案 0 :(得分:0)

要查看发生了什么,请删除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))
相关问题