Programming languages 修复Lisp语法
作为Lisp的新手,我想知道Lisp语法是否可以“修复” 有人说Lisp的语法是它最大的优点之一。我不太明白这一点 难道不能用空格、新行和缩进的组合来替换“明显的”括号吗?就像Python中一样 在我看来,括号是Lisp代码中使用最多的字符。我想知道这是不是真的,但如果是真的,这不是一个建议,语法中有一些冗余吗 这个问题有简单的答案吗?为什么有这么多括号 例如:Programming languages 修复Lisp语法,programming-languages,syntax,lisp,scheme,Programming Languages,Syntax,Lisp,Scheme,作为Lisp的新手,我想知道Lisp语法是否可以“修复” 有人说Lisp的语法是它最大的优点之一。我不太明白这一点 难道不能用空格、新行和缩进的组合来替换“明显的”括号吗?就像Python中一样 在我看来,括号是Lisp代码中使用最多的字符。我想知道这是不是真的,但如果是真的,这不是一个建议,语法中有一些冗余吗 这个问题有简单的答案吗?为什么有这么多括号 例如: (defun factorial (x) (if (= x 0) 1 (* x
(defun factorial (x)
(if (= x 0)
1
(* x
(factorial (- x 1)))))
为什么不:
defun factorial (x)
if (= x 0)
1
* x
factorial
- x 1
e、 g.在每行末尾加上括号,并在新行中始终打开括号。
只有1是不明确的-是1还是(1)-但我们可以引入一个例外-单个标记不是“列表化的”
这行吗
编辑:
谢谢大家!!我现在看到lispin中有一些。你所建议的似乎已经在中实现了
编辑:在下面的评论中指出该链接不再有效。这是网站存档中的最后一个有效版本:它可以工作。它被称为。来回答为什么这样的问题: 据我所知,它的主要用途是可读性,这样查看代码的人可以更容易地破译代码
希望有帮助。已经做了很多次了(一个<20行的预处理器将创造奇迹)。但让它们明确也有好处。它使代码和数据之间的并行性得以实现,并在某种程度上使您摆脱了那种让您觉得烦人的想法 您可以(举一个类似的例子)使用面向对象的语言,将所有方法的语法分组删除到类中(因此它们实际上变成了重载函数)。这会让你更像直接的命令式语言那样看待它,但也会失去一些东西 当你看lisp时,你应该认为“一切都是一个列表。Ommm”
(嗯,好的,“Ommm”是可选的)。有两种人™: 那些通过大脑中内置的堆栈机器来处理信息的人,以及那些以大块或块的形式消费信息的人。这些群体相互不相容;他们读不同的书,有不同的写作风格,最重要的是,用不同的编程语言编写代码。我属于第二组;然而,我认识许多来自第一组的程序员同事 对于第一组中的人来说,嵌套子句和子类绝对没有错;他们自然地掌握递归;他们慢慢地看代码,一句接一句,一行接一行,他们大脑中的堆栈机器在潜意识中不断地计算括号和括号。Lisp语法对他们来说很自然。见鬼,他们可能发明了堆叠机和Forth语言。但是,如果向他们展示Python(哦,不!),他们会无助地瞥一眼代码页,无法理解为什么这些愚蠢的代码块是打开的,没有匹配的结束语句 对于我们这些第二组可怜的家伙来说,除了将代码语句分组成块,并直观地缩进它们之外,别无选择。我们查看充满代码的屏幕,首先注意到大规模结构,然后是单独的函数或方法,然后是这些方法中的语句组,然后是自上而下的行和语句。我们不能线性地思考;我们需要视觉边界和清晰的缩进策略。因此,我们不能屈从于Lisp;对我们来说,这是一个不规则的混乱的关键字和愚蠢的括号
大多数编程语言都兼容这两种思维方式(这些“块”的存在是有原因的)。值得注意的例外是Lisp和Forth(仅限第一组)以及Python(仅限第二组)。如果你属于第二组,我认为你不需要让Lisp适应你的思维方式。如果您仍然需要函数式语言,请尝试Haskell。它是一种函数式语言,专为那些以块而不是堆栈来思考的人设计。一旦你写了几个宏,你就会改变主意。即使是Lisp语言家族的拥护者,也从自己的方言中去掉了一些括号: Lisp黑客注意:如果你习惯了传统的Lisp
cond
operator,这个if相当于相同的东西,但数量更少
圆括号。例如
(cond (a b)
(c d)
(t e))
变成
(if a b
c d
e)
(从)阅读这些链接,我发现了这个——还有Guile模块,它实现了这种语法,因此可以直接尝试 可以找到一种相当流利的Lisp方言(Arc)。(我想你应该先看看真正的代码是什么感觉)“也许这个过程应该被视为Lisp黑客的一种成年礼。”
--Steele和Gabriel,“Lisp的演变”,1993年,我多次比较了Lisp代码和其他语言中的等效代码。Lisp代码有更多的paren,但如果将其他语言中的所有分组字符[]{}()计算在内,Lisp的paren比所有这些都少。它不是更冗长,而是更一致 从这个角度来看,“问题”很简单,Lisp对所有内容都使用一种类型的构造(列表)。这是它的宏、对象系统、两个最强大的循环结构等的基础。你认为一个次要的风格问题(括号看起来会更酷吗?可能)实际上是语言能力的一个标志 也就是说,Lisp就是要赋予程序员权力。如果你愿意,写你自己的方言,让你做到这一点。Lisp(不同于我可以提到的一些语言!)是关于程序员能力的,所以请使用它。如果你能让它工作,也许它会起飞。我不认为它会,但是没有什么可以阻止你去尝试,不管怎样你都会学到很多。lisp“语法”的要点是它不存在
if foo < 0 :
bar
else :
baz
quuz
!defun fact (n)
if (zerop n)
1
* n
fact
(1- n)
!defun fact !n
if !zerop n
1
!* n !fact !1- n
@foo{blah blah blah}
(foo "blah blah blah")