我应该从Scheme学到什么?


10

我想知道我可以从Scheme中学习哪些独特的功能来帮助我成为更好的程序员?

我在主流语言方面有很多经验,并且我希望拓宽视野并了解其他语言所缺少的功能方面。我熟悉javascript的闭包,C#的lambda表达式,我想知道我能专注于其他语言中缺少的东西吗?除了Lisp语法外,我觉得到目前为止,我已经用其他语言遇到过。

Scheme / Lisp的独特之处是什么会教给我一些新东西?


3
Lisp值得您学习,当您最终获得启发时将会获得深刻的启发。即使您从未真正使用过Lisp本身,这种经验也会使您在余下的时间里成为一名更好的程序员。-埃里克·雷蒙德(Eric Raymond)
罗伯特·哈维


1
@Robert Harvery:另外:xkcd.com/224
Poindexter

2
以目前的形式,这个问题并不是特别具有建设性。如果您可以对其进行修改以寻求更具体的信息,则可能会很有用。
克里斯·弗雷德

另请参阅“ 后Linux时代的编程语言教学”和本文引用的教科书:“ 编程语言:应用和解释”,其中使用了方案的方言Racket语言
罗伯特·哈维

Answers:


7

Lisp最重要的定义特征可能是“代码即数据”。  使用任何其他语言都不会获得完全相同的体验。在C#中,最接近的类似物是表达式树。

正是这种质量使Lisp成为了一种出色的解析语言。这也是促使保罗·格雷厄姆(Paul Graham)说起Lisp的品质:“ Lisp的不寻常之处-实际上,是Lisp的定义品质-可以自己编写。” 尽管自托管编译器并不是什么新鲜事物,但是没有语言能够像Lisp一样优雅地进行编译。

元编程(Lisp也擅长的东西)也是值得学习的东西。

Paul Graham击败平均线
http://www.paulgraham.com/avg.html


1
我认为我从来没有那个“啊哈!”的原因 ESR向我保证的那一刻是,我已经在Prolog中获得了“数据编码”的启示。
Frank Shearar 2010年

1
Haskell是否具有“代码作为数据”属性?还是美丽很大程度上取决于动态的打字和反思?
乔伊·亚当斯

1
@Joey:我认为模板Haskell存在这一事实意味着Haskell缺少“代码作为数据”属性。
j_random_hacker 2011年

4

是的,它将帮助您以递归方式进行思考。我在一个编程语言课程中只学习了一个月左右的时间(计划),它帮助我发展了思考和解决编程问题的方式。

尝试其他编程范例总是有价值的。然后,您将以新的想法回到OO世界。

不是语法,而是推理,这是很棒的大脑锻炼。从递归和列表的有趣用法来看,Appart没有太多其他恕我直言,但这是值得的。


并非计划独有。任何(几乎任何一种)功能语言都适合执行递归。

我同意,但是与“主流”语言相比,OP似乎对Scheme感兴趣...
Xavier Nodet 2010年

1

延续

在计算机科学和程序设计中,延续是计算机程序控制状态的抽象表示。延续化了程序控制状态,即,延续是一种数据结构,表示过程执行中给定点处的计算过程;可以通过编程语言访问创建的数据结构,而不是将其隐藏在运行时环境中。它包含诸如过程的当前堆栈(包括其寿命在过程中的所有数据,例如“局部变量”)之类的信息,以及计算中的过程点。延续的实例可以在以后用作控制结构。调用后,它将从其表示的控制点恢复执行。“当前的延续”

然后尝试实现McCarthy的模糊运算符

1963年,Lisp的发明者约翰·麦卡锡(John McCarthy)发表了论文“计算的数学理论基础”,在其中他提出了函数amb(。,。)(在计算机程序意义上)。这个想法是amb(x,y)首先等于x。但是,如果稍后在计算中发现这导致某种矛盾,则x的值将缩回并替换为y。这比起初看起来要复杂得多。撤回一个值本质上意味着将整个计算状态回退到amb返回值x时的状态,然后滑入y值。这意味着以某种方式冻结并复制首次返回x时的整个状态。当发现矛盾时,将放弃程序的整个状态,并用重新激活的冻结版本代替。这些冻结状态称为延续。从许多方面来看,这就像是关于酸的GOTO声明。它可能导致跳转到代码上的任意位置。但是连续性比GOTO更好,因为它们更适合逻辑推理。


1

我可以想到以下几点:

  • 实宏(使用语言的全部功能来生成代码)
  • 同质性(数据作为代码,代码作为数据)
  • 懒惰评估
  • 延续

我也认为Lisp语言对于定义领域特定语言(DSL)应该很棒。如果您还不了解的话,可能需要阅读一下。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.