问题标签 [ansi-common-lisp]
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.
common-lisp - 关于 common-lisp 中的可选参数的错误
SBCL 64 位,1.1.7
如果我想创建一个包并使用包中的一些符号:CL,我将创建一个像这样的包:
但是,在这个包中,如果我定义一个带有可选参数的函数并在没有提供可选参数的情况下调用它,我总是会得到一个错误:
定义一个宏得到同样的错误,但有更多信息:
我想可能是因为缺少 :CL 中的一些符号,那么如何解决这个问题呢?谢谢。
lisp - lisp 中的一个名为 xtoy 的函数,它返回一个从 x 到 y 的列表
我对 lisp 很陌生。我正在尝试编写一个名为 x2y 的函数,它接受 2 个整数参数 x 和 y,并返回从 x 开始并以 y 结束的整数列表
lisp - apply & funcall - 不同的结果
ANSI 通用 Lisp。为什么我在最后一种情况下得到另一个答案?
lisp - 与 `:key` 一起使用时,Common Lisp 中的#'adjoin 是否按照 HyperSpec 工作?
查看 HyperSpec中#'adjoin的文档,我在示例部分看到以下内容:
相反,我会期待以下内容:
我的期望是由于HyperSpec (17.2.1)中的以下文本:
当下图中列出的运算符 F 对序列 S 的每个元素 Ei 迭代地考虑对象 O 时,有时控制在 S 中测试 O 的存在的方式由 F 测试是有用的。这控制是基于使用 :test 或 :test-not 参数指定的函数提供的。
并进一步:
对象 O 可能不会直接与 Ei 进行比较。如果提供了 :key 参数,则它是一个参数的函数的指示符,该函数以每个 Ei 作为参数调用,并产生一个用于比较的对象 Zi。(如果没有 :key 参数,Zi 就是 Ei。)
:key 参数指定的函数永远不会在 O 本身上调用。但是,如果该函数对多个序列进行操作(例如,在 set-difference 中发生),则 O 将是在另一个序列的元素上调用 :key 函数的结果。
所以我们有 slist (序列,S) as'((TEST-ITEM 1))
和 O as '(new-test-item 1)
。为了检查 O 是否应该相邻,函数#'cadr
应用于 S 的元素,第一个是'(test-item 1)
。因此,该测试给出:
现在,当 O, , 与应用于S 的 E1'(new-test-item 1)
的结果进行检查时(当没有提供 时使用的相等函数),结果应该意味着 O 是邻接的。至少我会这么认为。我有什么误解?#'cadr
#'eql
:test
false
common-lisp - conses 的 print-object 方法的重新定义在不同的 CL 实现中具有不同的效果
尝试不以标准列表表示法打印 conses,而是始终以点对形式打印,以最小的努力,我以这种方式重新定义了print-object
该方法:
但是对于不同的实现效果是不同的。
在 Clozure CL 和 LispWorks Personal 中,结果是我所期待的:
而在 SBCL 和 AllegroCLexpress 中,列表的打印方式没有任何变化:
所以,我想知道这是否是由于语言规范中的一些歧义,如果这种行为被明确声明为未指定,如果这是由于 REPL 与包的某些交互,或者最后,如果有实现就这个定义而言是正确的,而其他的则不正确。最后要注意的是,在 SLIME 中给出这样的定义会对 SLIME 本身造成严重破坏!
有人可以阐明这些差异,并提出一种替代方法(如果存在的话,那么问题较小)来实现我的目标?
algorithm - Lisp 良好实践
两天前我开始学习 Lisp,正在阅读 Paul Graham 的 ANSI Common List,它以一种非常有趣的方式展示了语言结构。对于初学者来说,它不是太理论化,也不是太浅(就像 Sierra-Bate 的 Head First Java,我个人讨厌它)。在简短的通用语言介绍之后,他开始谈论列表并举了一个简单列表压缩的例子。基本上,设 el 是一个重复 n 次的元素。您将所有这些替换为一个 (n el) 列表。为此,他提供了一个代码实现,但我尝试自己做,这显然是有效的。如果可能的话,我希望有人分析我的代码并向我展示其实现的关键点,我确信有很多,因为这是我第一次接触 Lisp。谢谢大家!
methods - 如何使用标准函数调用方法对象
如何将方法对象称为函数?
Closer-mop和clos包都提供了将方法对象转换为函数的方法函数。但是,有没有办法在不包含另一个包的情况下做到这一点?如果没有,哪个包?(使用 SBCL),但是如果需要一个包,那么鉴别功能是如何做到的呢?
这是使用 find-method 获取方法对象的示例。那么问题是如何调用method-to-be- call 。
作为第二个问题,文档说鉴别功能首先尝试按类计算适用方法以查找方法对象,如果失败,则使用计算适用方法。为什么要采用这种两层方法?假设find-method正在执行这种两层方法是否正确,所以最好使用find-method?
-- 附录 -- 在下面的评论中,Rainer Joswig 指出这种查找方法形式是依赖于实现的:
他说说明符列表应该是类并建议:
所以我想把我的课放在那里:
显然(defclass a ... )没有将a设置为类。事实上,它并没有设置任何东西!
... 变量 A 未绑定。
但是,这有效:
所以类是 defclass 的返回值,而不是提供给 defclass 的符号的值。
oop - 常见的lisp/CLOS中如何定义和调用类方法
我想在类对象上定义方法,这些方法基于类的祖先继承,就像实例的方法继承一样。有没有办法做到这一点?
这是不起作用的:eql
-方法专业化。考虑这个例子:
调用会(wings-p (find-class 'woodpecker))
生成一个no-method-error
,您可以看到为什么 - classwoodpecker
显然不是eql
任何方法专家。
我想在 on 上定义“方法” bird
,animal
以便当我调用wings-p
on时(find-class woodpecker)
,wings-p
返回t
。
我觉得这是几乎所有其他 OO 系统的标准功能,但我不记得如何使用 CLOS 来做到这一点。
common-lisp - SBCL changes EQness of a local bound function object, even though it is not set?
Given this example code (from a Reddit /r/lisp question):
Above establishes a function NEXT
. Inside the LET
, we keep the old function in OLD-NEXT
. Then we redefine the global function NEXT
inside the LET
.
CCL/CMUCL/GCL/ECL/CLISP/LispWorks/ABCL:
Only SBCL (SBCL 1.3.11) has a different result:
The value of the local variable old-next
is no longer eq
to the value of the global variable *next*
.
Why???
scheme - 在 Common Lisp 中定义函数 Scheme 风格,没有 defun
在 Scheme 中,您可以定义如下函数
特别是,你可以做这样的事情
其中 g 是一些返回函数的函数。是否可以在 Common Lisp 中做同样的事情,即将函数符号与给定的匿名函数相关联?