当前位置:  开发笔记 > 编程语言 > 正文

修复Lisp语法

如何解决《修复Lisp语法》经验,为你挑选了8个好方法。

作为Lisp的新手,我想知道Lisp语法是否可以"修复"?

有人说Lisp中的语法是它最大的优势之一.我不太明白这一点.

是不是可以用白色空格,新行和缩进的组合替换"明显"的括号?就像在Python中一样?

在我看来,括号是Lisp代码中最常用的字符.我想知道这是否属实 - 但如果是,这不是一个建议,语法中有一些冗余吗?

这个问题有一些简单的答案 - 为什么这么多括号?

例如:

(defun factorial (x)
    (if (= x 0)
        1
        (* x 
           (factorial (- x 1)))))

为什么不:

defun factorial (x)
  if (= x 0)
    1
    * x
      factorial
        - x 1

例如,在行尾用括号括起来,并始终在新行上打开它们.只有1是模棱两可的 - 是1还是(1) - 但是我们可以引入一个例外 - 单个令牌不会"被分解".

这可行吗?

编辑:

谢谢你们!我现在看到lispin 网站上有一些链接.



1> dnolen..:

一旦编写了几个宏,你就会改变主意.


Lisp宏不适用于s表达式.带括号,列表,符号等的S表达式只是外部表示.Lisp宏可以处理内部数据.外部表示表达式的方式与宏无关.
Dylan是一个不含paren的中缀Lisp,它仍然包含宏.实现的Common Lisp需要其语法来编写宏,但是parens并不是宏概念所固有的.
@Chuck,我并不是说parens是让宏成为可能的原因.@Rainer,你是对的.但在我看来,Lisp坚持用于构造代码的parens在推理宏时减轻了认知负担.

2> MarkusQ..:

已经做了很多次(一个<二十行预处理器会做奇迹).但是将它们明确化也是有利的.它将代码和数据之间的并行性带回家,并以某种方式引导您走出那种让您觉得烦恼的想法.

你可以(对于一个类似的例子)采用面向对象的语言并将所有方法的语法分组移除到类中(因此它们实际上变成了重载函数).这会让你更直观地看待它,但是也会丢失一些东西.

当你看看口齿不清时,你应该想到"一切都是一个清单.嗯"

(好吧,好吧,"嗯"是可选的).



3> Ken..:

"也许这个过程应该被视为Lisp黑客的成年礼."

- Steele和Gabriel,"Lisp的演变",1993年



4> cmsjr..:

您的建议似乎已在Lispin中实现

编辑: sindikat在下面的评论中指出该链接不再有效.以下是来自Web Archive的网站的最后一个有效版本:http://wayback.archive.org/web/20080517144846id_/http: //www.lispin.org/


有意思......反过来也是如此,例如是否有Python的变体使用括号而不是缩进?
我敢肯定,如果python也是50岁的话会有一个...... :)

5> Ken..:

有几次我在其他语言中比较了Lisp代码和等效代码.Lisp代码有更多的parens,但是如果你用其他语言计算所有分组字符[] {}(),那么Lisp比所有这些都少.它并不冗长:它更加一致!

从这个角度来看,"问题"只是说Lisp使用一种类型的构造(列表)来处理所有事情.这是它的宏,它的对象系统,它的几个最强大的循环结构的基础,等等.您认为小问题(括号看起来更酷?可能)实际上是语言能力的标志.

也就是说,Lisp就是为程序员赋权.如果你愿意,可以编写你自己的方言,让你这样做.Lisp(不像我能提到的一些语言!)是关于程序员的力量,所以使用它.如果你可以使它工作,也许它会起飞.我认为它不会,但没有什么可以阻止你尝试,你会学到很多东西.



6> Attila Lendv..:

lisp"语法"的观点是它不存在.s表达式是一个身份树,其中树结构由parens(缩进)表示.值得注意的是,性别仅仅是一种低级别的代表,但最终人们更喜欢它并继续使用它.

什么一种表达手段,执行引擎是非常灵活的Lisp和它也是上下文敏感的.

在其他语言中,上下文敏感度水平要低得多,并且可用于构建自己的抽象的构建块集不太可自由扩展.因此,表示少数给定结构的特殊语法适合图片.

在lisp中,我可以改变一切的含义,即使是以上下文敏感的方式.对于一些预定义的构造具有特殊语法将是愚蠢的,因为我可能最终使用我自己的"if"或我自己的专用闭包等.如果我的新'if'需要4个参数(例如,如果是程序并告诉某些团队在某些情况下总是失败或成功)?我应该如何扩展预定义'if'的语法?使用AST(sexps)要容易得多,但为什么还要特别使用特殊语法呢?

另请注意,使用像emacs这样的编辑器可以非常轻松地以结构化方式编辑这样的树.例如,拥有一个键来转换树中的两个节点对于交换变量声明和交换程序块中的两个语句同样有用(提示:这就是为什么"额外"的parens在let,cond等中有用).

所以,这就是为什么lisp的非语法对于那些习惯于扩展语言的想法而不是弯曲问题以适应预定义的工具集的人来说如此吸引人的原因 ......但这并不意味着语法糖不用于用户给定的结构!

我们使用的用户定义语法的一些示例:

cl-syntax-sugar - 最显着的扩展是[]用于微小闭包的parens,你不想命名闭包的变量

cl-quasi-quote - 最值得注意的是在lisp代码中内联xhtml生成的语法(请注意,此语法由用户库提供,并且可以以上下文敏感的方式启用)


Lisp通常有两阶段语法.具有S表达式的数据语法和s表达式上的程序语法.两者都是语法 - 它涉及语言(Lisp)中有效'句子'(程序)的结构.

7> Pete Kirkham..:

它可以工作.它叫做迪伦.


我会这样说:"一个人可以尝试,它叫做迪伦"...... :)

8> Frank Kruege..:

甚至保罗格雷厄姆,Lisp系列语言的声音倡导者,也从他自己的方言Arc中删除了一些括号:

Lisp黑客的注意事项:如果你已经习惯了传统的Lisp cond算子,那么这相当于同样的事情,但括号更少.例如

(cond (a b)
      (c d)
      (t e))

(if a b
    c d
    e)

(来自Arc教程)


问题是括号提供了分组,而Graham的IF中缺少分组.使用COND我将光标放在两个子句之间并按mt(即:交换性别)并交换它们.我可以向上或向下移动条款.
Sure Lisp有很多语法.语法是关于语言中有效表达式的结构.查看HyperSpec中Common Lisp构造的语法 - 它是在s-expressions之上定义的.有些是内置的,有些是通过宏实现的.Lisp用于播放语法.
推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有