作为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 网站上有一些链接.
一旦编写了几个宏,你就会改变主意.
已经做了很多次(一个<二十行预处理器会做奇迹).但是将它们明确化也是有利的.它将代码和数据之间的并行性带回家,并以某种方式引导您走出那种让您觉得烦恼的想法.
你可以(对于一个类似的例子)采用面向对象的语言并将所有方法的语法分组移除到类中(因此它们实际上变成了重载函数).这会让你更直观地看待它,但是也会丢失一些东西.
当你看看口齿不清时,你应该想到"一切都是一个清单.嗯"
(好吧,好吧,"嗯"是可选的).
"也许这个过程应该被视为Lisp黑客的成年礼."
- Steele和Gabriel,"Lisp的演变",1993年
您的建议似乎已在Lispin中实现
编辑: sindikat在下面的评论中指出该链接不再有效.以下是来自Web Archive的网站的最后一个有效版本:http://wayback.archive.org/web/20080517144846id_/http: //www.lispin.org/
有几次我在其他语言中比较了Lisp代码和等效代码.Lisp代码有更多的parens,但是如果你用其他语言计算所有分组字符[] {}(),那么Lisp比所有这些都少.它并不冗长:它更加一致!
从这个角度来看,"问题"只是说Lisp使用一种类型的构造(列表)来处理所有事情.这是它的宏,它的对象系统,它的几个最强大的循环结构的基础,等等.您认为小问题(括号看起来更酷?可能)实际上是语言能力的标志.
也就是说,Lisp就是为程序员赋权.如果你愿意,可以编写你自己的方言,让你这样做.Lisp(不像我能提到的一些语言!)是关于程序员的力量,所以使用它.如果你可以使它工作,也许它会起飞.我认为它不会,但没有什么可以阻止你尝试,你会学到很多东西.
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系列语言的声音倡导者,也从他自己的方言Arc中删除了一些括号:
Lisp黑客的注意事项:如果你已经习惯了传统的Lisp
cond
算子,那么这相当于同样的事情,但括号更少.例如(cond (a b) (c d) (t e))变
(if a b c d e)
(来自Arc教程)