问题标签 [lisp-2]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
6 回答
3848 浏览

variables - Common Lisp 与 Scheme 中函数和变量的独立命名空间

Scheme 为所有变量使用一个命名空间,无论它们是绑定到函数还是其他类型的值。Common Lisp 将两者分开,因此标识符“hello”在一个上下文中可能指代一个函数,而在另一个上下文中指代一个字符串。

(注1:这个问题需要上面的一个例子;随意编辑它并添加一个,或者用它给原作者发电子邮件,我会这样做。)

但是,在某些情况下,例如将函数作为参数传递给其他函数,程序员必须通过使用明确区分他指定的是函数变量,而不是非函数变量,#'如下所示:

我一直认为这有点像疣,但我最近遇到了一个论点,认为这实际上是一个特性:

...重要的区别实际上在于形式的语法,而不是对象的类型。在不知道所涉及的运行时值的情况下,很明显函数形式的第一个元素必须是函数。CL 接受了这一事实并将其与宏和特殊形式一起成为语言的一部分,这些形式也可以(并且必须)静态确定。所以我的问题是:当函数名的主要用途是出现在变量名很少出现的地方时,为什么你希望函数名和变量名在同一个命名空间中?
考虑类名的情况:为什么一个名为 FOO 的类要阻止使用名为 FOO 的变量?我唯一一次用 FOO 来引用这个类是在需要类名的上下文中。如果在极少数情况下我需要获取绑定到类名 FOO 的类对象,则可以使用 FIND-CLASS。

从经验来看,这个论点对我来说确实有意义。Haskell 中也有类似的情况,字段名称也是用于访问字段的函数。这有点尴尬:

这可以通过一些额外的语法来解决,NamedFieldPuns扩展特别好:

那么,对于这个问题,除了一致性之外,Common Lisp 与 Scheme 以及一般而言,所有值的单个命名空间与函数和非函数值的单独命名空间的优点和缺点是什么?

0 投票
2 回答
21917 浏览

clojure - Lisp-1 和 Lisp-2 有什么区别?

我试图理解 Lisp-1 和 Lisp-2 之间的区别以及这与 Clojure 的关系,但我仍然无法正确理解。任何人都可以启发我吗?

0 投票
4 回答
1176 浏览

lambda - 使用函数中的 lambda 值作为列表的第一个元素

我正在阅读 Peter Norvig 的人工智能编程范式,我遇到了一个我自己无法解决的问题(这是我对 Lisp 的介绍)。这个问题确实很小,但显然不是我的小脑袋能解决的。

为什么当函数的值为 lambda 时,将该函数用作列表的第一个元素是错误的。例如:

语言:

我希望这是有道理的!

0 投票
4 回答
929 浏览

namespaces - Common Lisp 一个 Lisp-n?

我知道 Common Lisp 对函数和变量有不同的绑定环境,但我相信它还有另一个用于标签体标签的绑定环境。还有比这更多的绑定环境吗?如果是这样,那么将 Common Lisp 归类为 Lisp-2 是否公平?

这些问题并不意味着迂腐或自行车脱落,我只是想更好地了解 Common Lisp 并希望能获得一些指示,了解在哪里更深入地研究它的规范。

0 投票
3 回答
336 浏览

nested - 是否有任何 lisp 有一个 s 表达式作为它们的头部,例如 ((f 2) 3 4)?如果不是,为什么?

是否有任何 lisp 支持嵌套的 s 表达式?例如

大概评估为(f 2)要应用于的函数/宏3 4

是否有可能有一个 lisp 支持这样的事情?或者是否有技术限制禁止/使其不切实际?

0 投票
3 回答
3568 浏览

scheme - 如何将函数存储在 Lisp 中的变量中并使用它

我想print在变量中存储一个函数,这样我就可以输入一些简短的东西p,例如:
Scheme

同样的方法似乎不适用于Common Lisp

我在Attempt 1上面遇到了这个错误:

这与Attempt 23Clisp

并与gcl

所以:

  • 是什么try using a symbol意思?p绝对是一个symbol;假阳性?
  • 怎么了eval?评估不p产生程序print吗?
  • 我以为Lisp程序是first class objects. 为什么Attempt 1不像在工作Scheme

编辑
(从下面的评论移动)

我想知道为什么(setf (symbol-function 'p) #'print)不能这样工作
(setf (symbol-function 'p) 'print)。我收到以下(不是很有帮助)错误:

我知道尖号(#)应该消除函数和
同名变量之间的歧义,但在这种情况下,只有一个print函数。

另外,为什么它不能使用defvar而不是setf像这样:

然而defvarsetf两者都为变量赋值。
相关的错误是:

0 投票
1 回答
841 浏览

namespaces - “Lisp-1 vs Lisp-2”与静态类型的语言相关吗?

(这是一个 CS 理论类型的问题;我希望这是可以接受的。)

Lisp-1 vs Lisp-2 ”的争论是关于函数的命名空间是否应该与所有其他变量的命名空间不同,并且它与允许程序员将函数作为值传递的动态类型语言相关。Lisp-1 语言(例如 Scheme)有一个命名空间,因此您不能同时拥有一个命名的函数f和一个命名的整数f(一个会影响另一个,就像两个命名的整数一样f)。Lisp-2 语言(例如 Common Lisp)有两个命名空间,因此您可以同时拥有两个变量,但您必须使用特殊语法(是函数和整数)f指定您所指的变量。#'ff

在我看来,如果语言也是静态类型的(与大多数 Lisps 不同),则主要的技术问题,即消除函数与整数的歧义的需要不是问题。例如,如果一个sort函数需要一个列表和一个小于函数作为显式签名,

那么函数和其他所有内容是否在同一个命名空间中都没有关系。 sort(mylist, myless)如果是一个函数,只会通过类型检查myless---不需要特殊的语法。有人认为一个命名空间比两个命名空间更美观,但我想关注技术问题。

假设所讨论的语言是静态类型的,那么两个命名空间是否会变得更困难或更容易出错(或者相反,对于一个命名空间)?

(我在我正在研究的领域特定语言的背景下考虑这个问题,我想确保我不会遇到问题。使用两个名称空间来实现会更容易( Lisp-2),并且由于它是静态类型的,因此不需要等效的#'f。我一般问这个问题是因为我想听听一般观点,也许会意识到我还不知道要问的问题。)

0 投票
1 回答
478 浏览

clojure - 在 Common Lisp 中调用函数列表

在 Clojure 中,我可以定义一系列函数,然后像调用其他值一样调用它们,如下所示:

产生以下输出:

尝试在 Common Lisp 中做同样的事情只会导致错误:

打电话给我op#'op不起作用。

那么有没有办法在 CL 中做到这一点?

0 投票
1 回答
235 浏览

macros - Common Lisp Lisp-1 宏

我正在尝试在 common lisp 中模拟方案的单个命名空间,并使用扩展为 lambda 的宏(基于 Doug Hoyte),其中函数位置中f!符号(类似于 Doug Hoyteo!和符号)的每次使用都会扩展为g!相同的表达式,但funcall在每次调用的函数位置添加。例如:

将扩展为:

宏当前如下所示:

但鉴于上述输入,它(据我所知)扩展到:

在宏定义中,F!F 不应该被引用或不被引用,而 parmlist 应该只是不被引用。到底是怎么回事?提前致谢!

0 投票
3 回答
459 浏览

clojure - 在 Common Lisp 中模拟 Clojure 风格的可调用对象

在 Clojure 中,hash-map 和向量实现invoke了 ,因此它们可以用作函数,例如

或者,对于向量,

可以通过实现 Clojure 中的可调用对象来实现它们IFn。我是 Common Lisp 的新手——可调用对象是可能的,如果是这样,实现它会涉及什么?我真的很想能够做类似的事情

而不是乱七八糟的代码aref。同样,如果您可以以相同的方式访问其他数据结构(例如字典)的条目,那将会很酷。

我查看了 Lisp/Scheme 中函数对象的wiki 条目,似乎拥有一个单独的函数命名空间会使 CL 的问题变得复杂,而在 Scheme 中,你可以用闭包来做到这一点。