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

lisp缺少什么特性?[关闭]

  •  9
  • bennybdbc  · 技术社区  · 14 年前

    我读到大多数语言越来越像lisp,采用lisp已经有很长一段时间的特性。我在想,Lisp没有哪些新老功能?我说的lisp是指最常见的方言,如common lisp和scheme。

    9 回复  |  直到 7 年前
        1
  •  7
  •   Mike    7 年前
    • 通过引用(C++/C)
    • 字符串插值(perl/ruby)(尽管 CL21 )
    • 不错的中缀语法(虽然还不清楚是否值得)(python)
    • 一元“迭代”构造,可以重载以供其他用途(haskell/c/f/scala)
    • 静态类型(尽管不清楚是否值得)(许多语言)
    • 类型推断(至少在标准中没有)(caml和许多其他的)(尽管cl做一些类型推断,不像python)
    • 抽象数据类型(haskell/f/caml)
    • 模式匹配(haskell/f/caml/scala/others)(在cl中,有类似libs的 optima )
    • 回溯(尽管还不清楚是否值得)(序言)
    • 多态 (见安德鲁·迈尔斯的回答)
    • 不可变的数据结构(许多语言)(通过库提供,如 Fsets
    • 惰性计算(haskell)(通过库提供,如 clazy 或一个 cl21 module )

    (请添加到此列表,我已将其标记为社区wiki。)

    这只是指常见的lisp和scheme标准,因为特定的实现已经独立地添加了许多这些特性。事实上,这个问题有点搞错了。在Lisp中添加功能非常容易 更好的 拥有一种没有许多特性的核心语言。这样,人们就可以根据自己的需要定制自己的语言。

    当然,有些实现将核心lisp打包成一系列这些特性作为库。至少在计划方面, PLT Scheme 提供以上所有功能*,主要作为库。我不知道普通的口齿不清有什么等价物,但可能有一种。

    *也许不是中缀语法?我不确定,我从没找过。

        2
  •  10
  •   jrockway    14 年前

    这个问题已经被问过无数次了,但还是这样。普通的lisp是在人类被认为便宜,机器被认为昂贵的时候产生的。普通的lisp语言让人类变得更容易,但却让计算机变得更难。lisp机器很贵;带dos的pc很便宜。这不利于它的普及;与其买一台更好的计算机,不如让更多的人用表达能力较弱的语言犯错。

    快进30年,结果发现这不是真的。人类非常非常昂贵(而且非常短缺;试着雇佣一个程序员),而计算机非常非常便宜。甚至比泥土还便宜。当今世界所需要的正是普通lisp所提供的;如果lisp现在被发明,它将变得非常流行。因为它已经30岁了(加上!)然而,没有人想到要看技术,而是用相似的概念创造了自己的语言。你今天用的就是这些。(Java+垃圾收集是其中的一大创新。多年来,GC一直被认为“太慢”,但当然,有一点研究,现在 更快 而不是管理你自己的记忆。对人类来说也更容易。时代如何变化…)

        3
  •  3
  •   Pillsy    14 年前

    对于common lisp,我认为以下特性值得添加到未来的标准中,在另一个标准产生的荒谬的不太可能的假设情况下。所有这些都是几乎每一个积极维护的cl实现以微妙的不兼容的方式提供的,或者存在于广泛使用和可移植的库中,因此拥有一个标准将为用户提供显著的好处,同时不会给实现者带来不适当的困难。

    • 使用底层操作系统的一些特性,如调用其他程序或处理命令行参数。我使用的每一个cl实现都有类似的东西,而且它们都非常相似。

    • 基本宏或特殊窗体 BACKQUOTE , UNQUOTE UNQUOTE-SPLICING .

    • CLOS的元对象协议。

    • 用户定义的协议 LOOP 条款。还有别的办法 回路 可以进行增强,这可能也不会太痛苦,比如子句绑定多个值,或者在泛型序列上迭代(而不是需要不同的子句 LIST S和 VECTOR s)。

    • 集成了 PROVIDE REQUIRE ,同时不准备 提供 要求 .

    • 更好、更可扩展的流设施,允许用户定义自己的流类。这可能会更痛苦一些,因为有两个相互竞争的提议,灰色流和“简单流”,这两个都是由一些cl实现来实现的。

    • 更好地支持cltl2中描述的“环境”。

    • 一个用于合并尾部调用的声明,以及描述看起来像尾部调用的调用不存在的情况(因为 UNWIND-PROTECT 形式, DYNAMIC-EXTENT 声明、特殊变量绑定等)。

    • 不诋毁 REMOVE-IF-NOT 还有朋友。消除 :TEST-NOT 关键字参数和 SET .

    • 弱引用和弱哈希表。

    • 用户提供的哈希表测试。

    • PARSE-FLOAT . 当前,如果要将字符串转换为浮点数,则必须使用 READ (可能会做各种你不想做的事情)或者滚动你自己的解析函数。这太傻了。

    这里有一些更雄心勃勃的功能,我仍然认为是值得的。

    • 用于定义将与标准通用序列函数一起工作的序列类的协议(如 MAP , REMOVE 和朋友)。在可变亲属旁边添加不可变的字符串和conse可能也不错。

    • 提供一组更丰富的关联数组/“映射”数据类型。现在我们已经有了从conse(alist和plist)和hash表中构建的特殊内容,但是没有平衡的二叉树。提供通用的序列函数来处理这些函数。

    • 固定 DEFCONSTANT 所以它做了一些不那么无用的事情。

    • 更好地控制读者。这是一个非常强大的工具,但它必须非常小心地使用,以避免做的事情,如实习新的符号。另外,如果有更好的方法来管理readtables和自定义reader语法,那就更好了。

    • “原始字符串”的读取语法,类似于python提供的语法。

    • CLOS类和插槽有更多的选项,允许更多的优化和更好的性能。一些例子包括“primary”类(在类的超类列表中只能有一个“primary”类)、“sealed”泛型函数(因此不能向它们添加更多方法,从而允许编译器对它们进行更多的假设)和保证绑定的插槽。

    • 螺纹支架。大多数实现要么现在支持smp,要么在不久的将来支持smp。

    • 确定更多的路径名行为。实现之间有很多令人讨厌的不兼容性,比如clisp在使用 PROBE-FILE 在目录中,或者实际上没有标准函数告诉您路径名是否为目录名。

    • 支持网络套接字。

    • 一个通用的外部函数接口。这将不可避免地是最低的公分母,但我认为拥有一些您可以移植地依赖的东西将是一个真正的优势,即使使用一些实现提供的更酷的东西仍然会被降级到扩展领域。

        4
  •  2
  •   asm    14 年前

    这是回应在内森·桑德斯回复下评论的讨论。这是一个有点多的评论,所以我添加到这里。我希望这没有违反StackOverflow的礼仪。

    ad hoc多态性定义为基于指定类型的不同实现。在使用泛型方法的公共lisp中,您可以定义如下内容,这正是您所要定义的。

    ;This is unnecessary and created implicitly if not defined.  
    ;It can be explicitly provided to define an interface.
    (defgeneric what-am-i? (thing))
    
    ;Provide implementation that works for any type.
    (defmethod what-am-i? (thing)
      (format t "My value is ~a~%" thing))
    
    ;Specialize on thing being an integer.
    (defmethod what-am-i? ((thing integer))
      (format t "I am an integer!~%")
      (call-next-method))
    
    ;Specialize on thing being a string.
    (defmethod what-am-i? ((thing string))
      (format t "I am a string!~%")
      (call-next-method))
    
    
    CL-USER> (what-am-i? 25)
    I am an integer!
    My value is 25
    NIL
    CL-USER> (what-am-i? "Andrew")
    I am a string!
    My value is Andrew
    NIL
    
        5
  •  1
  •   sfg    14 年前
    • 找到好的库可能比用更流行的语言更难。
    • 它不像haskell那样是纯功能的
        6
  •  1
  •   Noah Lavine    14 年前
    • 整个程序转换。(这就像宏一样,但对所有内容来说。您可以使用它来实现声明性语言特性。)相当于,向编译器编写外接程序的能力。(至少,scheme遗漏了这一点。可能不是。)
    • 内置定理助手/证明检查器,用于证明有关程序的断言。

    当然,我不知道其他语言有这些,所以我认为在功能方面没有太大的竞争。

        7
  •  0
  •   nickik    14 年前

    你在问荣格的问题。最有特色的语言不是最好的。语言需要目标。

    我们可以加上这些

    * Pass-by-reference (C++/C#)
    * String interpolation (Perl/Ruby)
    * Nice infix syntax (though it's not clear that it's worth it) (Python)
    * Monadic 'iteration' construct which can be overloaded for other uses (Haskell/C#/F#/Scala)
    * Static typing (though it's not clear that it's worth it) (many languages)
    * Type inference (not in the standard at least) (Caml and many others)
    * Abstract Data Types (Haskell/F#/Caml)
    * Pattern matching (Haskell/F#/Caml/Scala/others)
    * Backtracking (though it's not clear that it's worth it) (Prolog)
    * ad-hoc polymorphism (see Andrew Myers' answer)
    * immutable data structures (many languages)
    * lazy evaluation (Haskell)
    

    但那会成为一种好的语言。如果使用call by ref,则语言不起作用。

    如果你看一看新的清单。其中一些是实现的,而另一个是cl没有实现的,这就形成了一种好的语言。

    例如,clojure添加了一些:

    多态 懒惰的评价 不可变数据结构 类型推断(大多数动态语言都有这样的编译器)

    我的答案是:

    接受过教育的计划保持原样。 如果他们想做一个新的,cl可以在标准中加入一些ideos。

    它的lisp大部分可以添加libs。

        8
  •  -1
  •   Brian    14 年前

    像样的语法。(有人不得不这么说。)它可能很简单/统一/同质/宏功能/等等,但作为一个人,我只是讨厌看它:)

        9
  •  -3
  •   Mel Gerats    14 年前

    它缺少一个好的ide

    推荐文章