S表达式的可读性


9

简而言之,对于那些不知道的人,Lisp函数/操作符/构造都统一地这样称呼:

(function arg0 arg1 ... argN)

那么用类似C的语言表达的是

if (a > b && foo(param))

变成了Lisp sexp

(if (and (> a b) (foo param)))

。随着事情变得更加真实/复杂,对我来说,它们对应的s表达式也是如此。

我知道这很可能是一个主观的问题,但是-对于许多Lisp黑客来说,这个烦恼总是必须解决的吗?

还是迟早会最习惯这种(缺乏)语法的?

无论如何,为了提高可读性(尤其是从长远来看),添加分界线(大多数情况下通常不会添加C等效项)是个好主意吗?任何其他建议都将受到欢迎。


1
您是否尝试过在像emacs这样的具有Lisp意识的环境中使用Lisp?我不会以其他方式碰它。
David Thornley

不,我没有,它可以改善我的Lisp体验吗?
vemv 2011年

编写短函数也非常重要,尽管我只玩过Clojure。
凯文

3
在良好的Lisp环境中,您可以忽略括号并通过缩进来读取结构。如您所知,通过计算括号来读取结构确实非常烦人。
David Thornley

Answers:


8

你如何解析

if (a > b && foo(param)) {
  doSomething();
} else {
  doSomethingElse();
}

解析树可能看起来像

if:
  condition:
    and:
      lt:
        left: a
        right: b
      function:
        name: foo
        param: param
  true-block:
    function:
      name: doSomething
  false-block:
    function:
      name: doSomethingElse

嗯...让我们将该树序列化为一个列表,前缀表示法

if(and(<(a, b), function(foo, param)), function(doSomething), function(doSomethingElse))

这种解析树格式非常易于操作,但是我有一个问题。我讨厌分隔符。我喜欢终结者。同时,我喜欢撒在空白处。

if( and (<(a b) function(foo param)) function (doSomething) function ( doSomethingElse))

嗯...额外的空格使某些内容难以解析...也许我可以做一个规则,将树表示为(根叶叶)。

(if (and (< a b) (function foo param)) (function doSomething) (function doSomethineElse)

现在我对解析树的序列化 lisp(重命名要应用的函数,这可能会运行)。如果我想要编写程序的程序,那么只需操纵解析树就可以了。

这并不完全是S表达式的产生方式,但是它是早期发现的,并且是Lisp程序员使用的一项功能。我们的程序在某种意义上是预先准备好的,并且由于格式的原因,编写用于操纵程序的程序相当容易。这就是为什么有时缺乏语法的原因。

但正如David所说,请使用具有S表达式意识的编辑器。与xml中的右括号相比,您更有可能丢失s表达式中的右括号(</foo>仅closes <foo>,但right paren会关闭所有s表达式)。在球拍中,某些表达式使用方括号加上良好的缩进样式可以解决大多数问题。

Lisp版本:

(if (and (< a b) (foo param))
  (doSomething)
  (doSomethingElse))

还不错


毫无疑问,列表比exprs +语句功能更强大。尝试Emacs(或其他功能)很诱人,但最近一次尝试却让我非常害怕。sexp意识究竟带来了什么?
vemv 2011年

简单的东西:它们在关闭和打开的parens上高亮显示(或以不同的方式突出显示整个s表达式)。他们有很好的缩进规则。Emacs还有其他东西,但是对于可读性来说,它们可能并不那么重要。还有其他了解S表达式的编辑器。您不需要 emacs。如果emacs吓到了您,请尝试使用textmate,sublime等软件包。一旦您的编辑器开始帮助提高可读性,事情就会变得容易一些。我会在球拍中做很多花俏的事情,这允许在方括号可用的任何地方使用方括号。能够切换有助于提高可读性。
ccoakley 2011年

1
顺便说一句,利用嵌套的let,define等将这些东西分解成较小的部分。如果您不能为一个块起一个好名字,请将其作为对您设计的警告。在名字太小和太大而难以阅读之间找到平衡。
ccoakley 2011年

哦,最后的建议是...令人难忘:)在我撰写本文时尝试Sublime。
vemv 2011年

5

s-exp真正的好处是,经过短时间后,您再也看不到它们了,就像python一样,但是计算机仍然很容易找到树。

  • 因此,缩进是自动的,没有歧义,当您要结束一个块时,您不必两次按Tab键或类似操作。

  • 如果您选择一些随机代码,则只需使用您喜欢的编辑器中的一个命令即可轻松缩进整个内容

  • 您可以非常轻松地浏览代码,在s-exp之间跳转,使用合适的编辑器进行交换等。

另外,由于要处理的数据与要编写的代码相同,因此可以使用相同的语言来操作代码,对吗?

好吧,您可以做到,那就是宏,在像其他列表一样对代码进行评估之前,您可以对正在编写的代码进行操作,这就是为什么人们认为Lisp是一种“可编程编程语言”。您编写的代码可以为您编写代码。

是一篇很好的文章,描述了Lisp的本质以及为什么Lisp程序员在看到XML时会咧嘴笑。

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.