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

Common Lisp和Scheme中函数和变量的单独名称空间

  •  30
  • cjs  · 技术社区  · 16 年前

    Scheme对所有变量使用一个名称空间,而不管它们是绑定到函数还是其他类型的值。Common Lisp将两者分开,这样标识符“hello”可以在一个上下文中引用函数,在另一个上下文中引用字符串。

    但是,在某些上下文中,例如将函数作为参数传递给其他函数,程序员必须使用 #' ,例如:

    (sort (list '(9 A) '(3 B) '(4 C)) #'< :key #'first)

    我一直认为这有点棘手,但最近我遇到了一个问题 argument 这实际上是一个特性:

    这个 重要的区别实际上在于形式的语法,而不是形式 对象的类型。不知道任何关于运行时值的信息 必须是一个函数。CL接受了这一事实,并将其作为 语言,以及宏和特殊形式,它们也可以(而且必须) 可以静态地确定。所以我的问题是:你为什么想要 函数名和变量名应在同一位置
    考虑类名的情况:为什么一个名为FO的类应该防止 名为FOO的变量的使用?我唯一一次提到 名为FOO的类位于需要类名的上下文中。如果 我很少需要获取绑定到 类名FOO,有FIND-class。

    data Point = Point { x, y :: Double {- lots of other fields as well --} }
    isOrigin p = (x p == 0) && (y p == 0)
    

    这可以通过一些额外的语法来解决,特别是 NamedFieldPuns 分机:

    isOrigin2 Point{x,y} = (x == 0) && (y == 0)
    

    6 回复  |  直到 11 年前
        1
  •  23
  •   Greg Hewgill    16 年前

    这两种不同的方法有两个名称:Lisp-1和Lisp-2。Lisp-1对变量和函数都有一个名称空间(如Scheme中所示),而Lisp-2对变量和函数有单独的名称空间(如Common Lisp中所示)。我提到这一点是因为你可能不知道这个术语,因为你在问题中没有提到它。

    维基百科 refers to this debate :

    加布里埃尔和皮特曼的论文名为 Technical Issues of Separation in Function Cells and Value Cells 解决这个问题。

        2
  •  11
  •   Svante    16 年前

    实际上,正如 the paper by Richard Gabriel and Kent Pitman ,争论是关于Lisp-5和Lisp-6的,因为已经存在其他几个名称空间,本文中提到了类型名、标记名、块名和声明名。 编辑:这似乎是不正确的,正如雷纳在评论中指出的:Scheme实际上似乎是一个Lisp-1。不过,以下内容基本上不受此错误的影响。

    我知道Lisp-5的支持者喜欢函数是数据这一事实,这是用语言核心表达的。我喜欢这样一个事实:我可以在不混淆编译器的情况下调用列表“list”和汽车“car”,而且函数从根本上说是一种特殊的数据。 编辑:这是我的主要观点:单独的名称空间根本不是一个缺点。

    what Pascal Constanza had to say

        3
  •  2
  •   Alex Martelli    16 年前

    我在Python(统一名称空间)和Ruby(方法和非方法的不同名称空间)中遇到了类似的区别。在这种情况下,我更喜欢Python的方法——例如,使用这种方法,如果我想列出一些东西,其中一些是函数,而另一些不是,我不需要根据它们的“函数性”对它们的名称做任何不同的事。类似的考虑也适用于所有函数对象被绑定而不是被调用的情况(高阶函数的参数和返回值等)。

    也可以调用非函数(如果它们的类定义 __call__

        4
  •  2
  •   Chuck    16 年前

    Scheme中函数的名称只是一个变量,其值为函数。不管我做什么 (define x (y) (z y)) (let ((x (lambda (y) (z y))))

    Scheme是一种典型的函数式语言,因此将函数视为数据是其宗旨之一。让函数成为自己的一种类型,并像所有其他数据一样存储,这是一种贯彻这一理念的方式。

        5
  •  1
  •   Ken    16 年前

    我看到的最大的缺点,至少对于CommonLisp来说,是可理解性。我们都同意它对变量和函数使用不同的名称空间,但它有多少名称空间?在PAIP中,Norvig显示它“至少有七个”名称空间。

    当一位受人尊敬的程序员写的一本语言经典书籍,甚至不能在一本出版的书中肯定地说,我认为这是一个问题。我对多个名称空间没有问题,但我希望该语言至少足够简单 某人 我可以完全理解它的这一方面。

    对于变量和函数使用相同的符号,我感到很舒服,但在更模糊的领域,出于恐惧,我会使用不同的名称(名称空间的冲突可能很难调试!),这真的不应该发生。

        6
  •  0
  •   Vatine    16 年前

    这两种方法都有好处。然而,我发现当这很重要时,我更喜欢同时拥有函数列表和变量列表,而不是错误地拼写其中一个。

    推荐文章