Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Programming languages 修复Lisp语法_Programming Languages_Syntax_Lisp_Scheme - Fatal编程技术网

Programming languages 修复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

作为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
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")