这可能是一个非常菜鸟的问题,但是我是Scheme的新手。当我尝试以下命令时:
(equal? (((lambda (s z) (s 3 z)) + 0) 3))
它给我以下错误:
application: not a procedure;
expected a procedure that can be applied to arguments
given: 3
arguments...:
按照我的理解,该表达式的计算结果应为(+ 3 0)等于3。我在哪里出错?
答案 0 :(得分:4)
一对同形异形配对过多。
我建议您在DrRacket中为更复杂的表达式中的每个参数使用自动缩进。
这是正确的版本:
(equal? ((lambda (s z) (s 3 z)) + 0)
3)
;; #t
请注意,3)
与((lambda ...
完全对齐,表明它与包含s-expression的lambda表达式处于完全相同的级别。
看看会发生什么,如果您使用上面的代码在DrRacket中开始新行,以指定并测试3
是equal?
的第二个参数:
(equal? (((lambda (s z) (s 3 z)) + 0)
3))
看到了吗? 3
偏离一个位置。它与(((lambda ...
的开头不完全对齐。但是您应该知道,如果3和带有lambda表达式的s-expression处于相同的层次结构级别(例如作为函数equal?
的参数)。
这就是为什么lispers向具有自动缩进功能的Lisp编辑器发誓的原因。因为通过这样小的但重要的提示,自动缩进可以帮助您驯服寄生虫。