代码之家  ›  专栏  ›  技术社区  ›  siddhadev

修复Lisp语法

  •  17
  • siddhadev  · 技术社区  · 17 年前

    在我看来,括号是Lisp代码中最常用的字符。我想知道这是不是真的——但如果是真的,这难道不是一个暗示,语法中有一些冗余吗?

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

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

    这行得通吗?

    编辑:

    谢谢大家!我现在明白了,有一些 links site .

    16 回复  |  直到 17 年前
        1
  •  31
  •   dnolen    17 年前

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

        2
  •  28
  •   MarkusQ    17 年前

    这已经做了很多次了(一个<20行预处理器会创造奇迹)。但明确表达它们也有好处。它强调了代码和数据之间的并行性,并在某种程度上让你摆脱了那种让你觉得它们很烦人的想法。

    当你看到lisp时,你应该想“一切都是一个列表。天哪”

        3
  •  20
  •   Ken    17 年前

    “也许这个过程应该被视为Lisp黑客的成年礼。”

        4
  •  12
  •   Community Mohan Dere    9 年前

    你的建议似乎已经在 Lispin

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

        5
  •  9
  •   Ken    17 年前

    我曾多次比较过Lisp代码和其他语言的等效代码。Lisp代码有更多的paren,但如果你计算其他语言中的所有分组字符[]{}(),Lisp的paren比所有这些都少。它不是更冗长:它更一致!

    也就是说,Lisp的核心是赋予程序员权力。如果你愿意,写你自己的方言,让你做到这一点。Lisp(与我提到的一些语言不同!)是关于程序员能力的,所以使用它。如果你能让它工作,也许它会腾飞。我不认为它会,但没有什么能阻止你尝试,无论哪种方式,你都会学到很多东西。

        6
  •  6
  •   Svante    17 年前

    lisp“语法”的要点是它不存在。s表达式是一个恒等式树,其中树结构由parens表示( 和 压痕)。值得注意的是,sexps只是一种低级表示,但人们最终更喜欢它并继续使用它。

    什么 指执行引擎 非常灵活 在lisp中,它也是 上下文敏感。

    在其他语言中,上下文敏感度要低得多,您可以用来构建自己的抽象的构建块集的可自由扩展性要低得得多。因此,表示少数给定构造的特殊语法符合这一情况。

    还要注意,使用像emacs这样的编辑器可以很容易地以结构化的方式编辑这样的树。例如,有一个键来转置树中的两个节点,对于交换变量声明和交换程序块中的两条语句同样有用(提示:这就是为什么“额外”paren在let、cond等中很有用)。

    所以,这就是原因 lisp的非语法特性是 吸引了许多习惯于扩展语言的人 而不是弯曲问题以适应预定义的一组工具。..但这并不意味着语法糖不用于用户给定的构造!

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

    • cl-syntax-sugar -最显著的扩展是 [] parens用于不想命名闭包变量的微小闭包
    • cl-quasi-quote <xml > 在lisp代码中内联xhtml生成的语法(请注意,此语法由 用户 库,并且可以以上下文敏感的方式启用)
        7
  •  5
  •   Pete Kirkham    17 年前

    它可以工作。它被称为 Dylan .

        8
  •  5
  •   Frank Krueger    17 年前

    甚至 Paul Graham 作为Lisp语言家族的声音倡导者,他从自己的方言中删除了一些括号 Arc :

    Lisp黑客注意:如果你习惯了传统的Lisp cond 运算符,这相当于同一件事,但数量更少 圆括号。例如

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

    成为

    (if a b
        c d
        e)
    

    Arc Tutorial )

        9
  •  3
  •   Alexander Temerev    17 年前

    对于第一类人来说,嵌套子句和子子句绝对没有错;他们自然地掌握递归;他们慢慢地看代码,一条一条地、一行一行地,大脑中的堆栈机器在潜意识层面上不断地计算括号和括号。Lisp语法对他们来说很自然。地狱,他们可能 发明 堆栈机和Forth语言。但是给他们看,比如Python(哦,不!),他们会无助地扫一眼代码表,无法理解为什么这些愚蠢的代码块是

    块

        10
  •  1
  •   Cristina    17 年前

    希望它能有所帮助。

        11
  •  1
  •   siddhadev    17 年前

    通过阅读链接,我找到了这个- Indentation-sensitive syntax

    A相当 promising 可以找到Lisp方言(Arc) here

        12
  •  1
  •   Svante    17 年前

    我个人对此的看法是:不要使用换行符和缩进作为“隐式”分隔符(我也不喜欢按运算符优先级进行隐式分组,但这是一个不同但相关的主题)。

    示例:这是有效的Python吗?它符合你的期望吗?

    if foo < 0 :
        bar
      else :
        baz
    quuz
    

        13
  •  1
  •   Cheery    17 年前

    你可以看看Clojure。括号更少,但需要记住的语法更多。

        14
  •  1
  •   Community Mohan Dere    6 年前

    我尝试并编写了几种依赖缩进的语法。最好的结果是,整个语法改变了它的性质,因此语言也从一种转向了另一种。好的基于缩进的语法已经不再接近lisp了。

    为缩进赋予句法意义的麻烦并不是来自白痴和\t与空白的争论。标记化既不是问题,因为读取换行符和空格不应该比其他任何事情都难。最困难的事情是确定缩进在出现的地方应该意味着什么,以及如何在不使语言语法过于复杂的情况下为其添加意义。

    我开始认为,当你通过一些巧妙的编程来减少括号的数量时,原始的lisp风格语法毕竟会更好。这可以做到,在当前的lisp实现中不那么容易,但在未来的lisp实施中可以更容易地做到。当只有几个规则需要标记时,解析起来既快速又简单,几乎不需要解析。

        15
  •  1
  •   hawkeye    12 年前

    reader system .

    编辑:一些使用示例:

    !defun fact (n)
      if (zerop n)
        1
        * n
          fact
            (1- n)
    
    !defun fact !n
      if !zerop n
        1
        !* n !fact !1- n
    

        16
  •  0
  •   Abhijith    17 年前

    alternate Racket Syntax .

    @foo{blah blah blah}
    

    读作

    (foo "blah blah blah")