我一直在使用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)))))
当前输出:
以上是当前的输出,我将尽我所知解释发生了什么。输入基本上包含三个参数。一个名称,用于命名函数。函数的参数,最后是函数体。
然后将这三个参数列在一起,然后它应该创建一个新函数。上图显示了我达到的错误。谢谢你的帮助!
答案 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))