除非你是有经验的,我建议你学会用Lisp写Lisp的,没怎么用Lisp写哈斯克尔。后者不是一个好主意。 Haskell工作非常不同。
Lisp不会做任何'currying'(或schönfinkeling;-))。
你可以写为:
CL-USER 5 > (defun curry (fn arg) (lambda (&rest args) (apply fn arg args)))
CURRY
CL-USER 6 > (mapcar (curry #'expt 2) '(2 3 4 5 6))
(4 8 16 32 64)
它的成本有点效率这样一来,虽然。
CL-USER 7 > (mapcar (lambda (base) (expt base 2)) '(2 3 4 5 6))
(4 8 16 32 64)
我个人比较喜欢后者,因为我有一个真正可读的变量名。这有助于调试器,在那里我可以看到回溯。类似这些工具在Lisp中可能比在Haskell中更重要。
CL-USER 12 > (mapcar (lambda (base) (expt base 2)) '(2 3 "four" 5 6))
错误。让我们看看回溯:
CL-USER 12 : 1 > :bb
...
Condition: In EXPT of ("four" 2) arguments should be of type NUMBER.
Call to SYSTEM::ARGS-TO-BINARY-ARITHMETIC-FN-NOT-OF-TYPE {offset 189}
SYSTEM::FN-NAME : EXPT
SYSTEM::ARG1 : "four"
SYSTEM::ARG2 : 2
TYPE {Closing} : NUMBER
Interpreted call to (SUBFUNCTION :ANONYMOUS SYSTEM::ANONYMOUS-LAMBDA):
BASE : "four"
现在我可以看到这个东西有一个名字。我将字符串"four"
传递给名为base
的变量。
使用REPL和调试工具进行交互式开发很常见。最好准备好对这种开发风格有用的代码。 Common Lisp没有经过优化,可以提供完整的程序编译器,并进行广泛的类型检查 - 就像Haskell一样。
Lisp的主要问题之一是它可能很难找出一段代码真正做什么。默认(具有前缀语法的严格功能程序)相对容易理解。但是有许多可能性来改变Lisp代码的含义(宏,宏读取,符号宏,元对象协议,建议......)。第一条规则:如果你正在编写基本的Lisp代码,坚持基本的句法和语义可能性。防守写。期望别人需要了解代码。为此,代码应该易读,易于理解,使用常见的习惯用法,并且应该是可调试的。
在Haskell中,很多具有数学背景的人都想以非常紧凑的方式编写代码,且抽象程度很高。你也可以在Lisp中做到这一点。但对于普通的代码,我不会去那条路线和更大的代码段,Lisp经常使用其他机制(通过宏代码转换,...)。
嗯,我的意思是简洁简洁......虽然我对CL还是比较新的,但不知道从哪里开始,我只涉及宏的基本知识。 @downvoter - 谨慎评论? – jaymmer 2013-03-22 11:11:32
@wvxvw我不明白你评论的第一部分。难道不能假设如果OP使用诸如“简明”这样的主观描述符来表明他或她正在陈述观点? – 2013-03-22 13:23:26
关于“......可以常规显示......”的内容,如果有的话,我会对引文感兴趣。此外,我觉得你的哪个例子更简洁可能取决于观众的背景。如果一个人没有任何数学背景,我怀疑第一个例子更容易理解。除此之外,我的观点是,这种平庸的行为总体而言对本论坛的功能和目的有害。 – 2013-03-22 14:34:03