经过几个月的关于Lisp,CL和Clojure的学习和使用,我仍然看不到有什么理由代替C#编写任何令人信服的理由。
我真的很想提出一些令人信服的理由,或者有人要指出我缺少的东西确实很大。
Lisp的优势(根据我的研究):
- 紧凑,富有表现力的符号-不仅是C#,是的...但是我似乎也可以用C#来表达那些想法。
- 对函数式编程的隐式支持-具有LINQ扩展方法的C#:
- mapcar = .Select(lambda)
- mapcan = .Select(lambda).Aggregate((a,b)=> a.Union(b))
- 汽车/第一= .First()
- cdr / rest = .Skip(1)....等
- Lambda和高阶函数支持-C#具有此功能,并且语法可以说更简单:
- “(lambda(x)(body))”与“ x =>(body)”
- Clojure中的“#(”与“%”,“%1”,“%2”很好
- 与对象分离的方法分派-C#通过扩展方法具有此功能
- 多方法分派-C#本身没有这种方法,但是我可以在几个小时内将其实现为函数调用
- 代码就是数据(和宏)-也许我没有“获得”宏,但是我没有看到一个不能将宏的概念实现为函数的示例。它不会改变“语言”,但我不确定这是一种优势
- DSL-只能通过功能组合来实现...但是可以工作
- 无类型的“探索性”编程-对于结构/类,C#的自动属性和“对象”都可以很好地工作,并且您可以轻松地升级为更强大的类型
- 在非Windows硬件上运行-是吗?在大学以外,我只认识一个不在家中运行Windows或至少在* nix / Mac上运行Windows VM的人。(再说一次,也许这比我想像的要重要,我刚刚被洗脑了……)
- 自底向上设计的REPL-好的,我承认这确实非常好,我在C#中错过了它。
我在Lisp中缺少的东西(由于C#、. NET,Visual Studio,Resharper的混合使用):
- 命名空间。即使使用静态方法,我也喜欢将它们绑定到“类”以对它们的上下文进行分类(Clojure似乎有这个,CL似乎没有。)
- 强大的编译和设计时支持
- 类型系统允许我确定我传递的数据结构的“正确性”
- 拼写错误的内容会实时下划线;我不必等到运行时就知道
- 建议自动进行代码改进(例如使用FP方法代替命令式方法)
- GUI开发工具:WinForms和WPF(我知道Clojure可以访问Java GUI库,但是对我来说它们是完全陌生的。)
- GUI调试工具:断点,插入,逐步,值检查器(文本,xml,自定义),监视,按线程调试,条件断点,调用堆栈窗口,可以跳转到任意级别的代码在堆栈中
- (为公平起见,我在Emacs + Slime方面的工作似乎提供了其中的一部分,但我偏爱VS GUI驱动的方法)
我非常喜欢Lisp周围的炒作,因此给了我一个机会。
但是,在Lisp中我能做的还是在C#中做不到的?在C#中可能更详细,但是我也有自动完成功能。
我想念什么?为什么要使用Clojure / CL?