问题标签 [setf]
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.
variables - 通过使用 SETF 定义变量来回避错误
全体人员,
我是坚持用 SETF 定义变量的类型之一。我已经升级到一台新机器(和一个新版本的 SBCL),它并没有让我侥幸逃脱(当然,我得到了适当的“==> undefined variable...”错误)
我的问题是,我已经编写了 20,000 行代码(错误地)用 SETF 定义我的变量,我不喜欢重写我的所有代码以让解释器消化所有代码的前景。
有没有办法关闭该错误以便解释可以继续?
任何帮助表示赞赏。
真挚地,
-托德
lisp - Lisp:找到与 fset 等效的 setf 方式
在 lisp中找到与fset等效的setf方式。
lisp - Setf 函数名称
阅读这个问题让我思考了什么是有效的汽车表达。显然,可以使用通常的语法“调用”符号和 lambda。根据hyperspec,
函数名n. 1.(在一个环境中)一个符号或一个列表(setf 符号),它是那个环境中一个函数的名称。2. 一个符号或一个列表(setf 符号)。
所以,理论上,(setf some-name)
是一个函数名。我决定试一试。
GNU CLISP、SBCL 和 ABCL 都会让我定义这个函数。但是,SBCL 和 ABCL 不允许我使用片段中显示的任何语法来调用它。另一方面,CLISP 将运行前两个,但在第三个仍然会出错。
我很好奇哪个编译器的行为正确。由于 SBCL 和 ABCL 同意,我会冒险猜测正确的实现应该拒绝该代码。作为第二个问题,我如何从代码片段中调用我令人难以置信的设计无用的函数,因为我上面尝试的东西不能移植。或者,也许更有用的是,
oop - 为什么泛型函数与访问函数 lisp 不同
从我读过的东西中,我了解到 CLOS 中的访问器函数允许程序员获取和设置变量,它会生成一个通用函数,该函数的名称是提供给访问器的,您需要定义不同的方法。但我是什么我想知道为什么泛型函数的工作方式与访问器函数不同?
例如
我可以定义
但是如果我要拿走访问器并添加
然后在执行以下代码后出现错误。
除非我将通用函数和方法重新定义如下
或执行
我的问题是为什么会发生这种情况?为什么我不能用泛型函数达到相同的结果?
common-lisp - 如何在 setf 地方执行功能
我有一个包含一些符号和值的列表。目标是使用访问器设置类槽,其符号由列表提供:
我试过通过宏:
这也失败了,因为to-call
它是一个符号而不是一个列表。
eval
不起作用,因为to-call
它是一个词法变量;- 不可能
let
通过宏来给它列表; - 我已经尝试过
with-slots
,with-accessors
但问题仍然存在,因为它们也是宏。 - 我考虑过声明其他宏的宏,以及符号宏。
如何通过与列表中的符号对应的访问器设置插槽?
谢谢你。
common-lisp - (defun (setf …)) defsetf 和 define-setf-expander 的典型用例是什么
使用 Common Lisp 进行开发时,我们有三种可能性来定义新的setf
形式:
我们可以定义一个函数,其名称是两个符号的列表,第一个是
setf
,例如(defun (setf some-observable) (…))
。我们可以使用 的缩写形式
defsetf
。我们可以使用 的长形式
defsetf
。我们可以使用
define-setf-expander
.
我不确定每种可能性的正确或预期用例是什么。
对这个问题的回答可以暗示最通用的解决方案,并概述其他解决方案优于其他解决方案的上下文。
common-lisp - 如何在 common lisp 中编写 multf 函数
我正在寻找一种方法来修改属性列表中的属性值,方法是将其与给定因子相乘,类似于使用 incf 添加到值。
使用 incf 我可以说:
使用宏我可以通过以下方式获得结果,但这使用 getf 两次:
我将如何做到这一点,以便我可以只使用一次 getf 获得相同的结果?
也许有这个功能的包,但我在网上找不到。任何帮助表示赞赏!这不是功课,我只是想优化我的代码,我很想更好地理解这种语言。我读到了 setf-expanders 和 compiler-macros,但我不知道它们是否适用于这里以及如何使用它们。
lisp - 非破坏性修改哈希表
是否可以非破坏性地将新的键值对添加到 Common Lisp (SBCL) 哈希表中?向哈希表添加新元素的标准方法是调用:
但是对setf
修改的调用会*hash-table*
破坏原始文件。我有一个应用程序,我想利用哈希表查找的效率,但我也想非破坏性地修改它们。我看到的解决方法是在对其进行操作之前复制原始哈希表,但这在我的情况下是不切实际的,因为我正在处理的哈希表包含数千个元素并复制大型哈希表,例如循环将首先否定使用它们的计算效率优势。
set - 什么是 setf,它是 Dr.Racket 中的有效函数吗?
我有一个任务,我必须为表达式定义一个别名,在其中一个指南中,我们被告知使用 setf 或列表列表来定义它们。更具体地说,我们需要将它们的 lambda 演算值分配给别名 ADD/SUCC/PRED/etc,例如 ---> (ADD := (λ mnf x.nf (mfx))) <----。
这样,在任何给定操作中用别名替换它们之后,我们就可以操作它们。由于我没有找到任何明确的解释,而且我不知道如何继续使用 setf,所以如果你们中的任何人能给我一个小费,我会发现它真的很有帮助。
到目前为止,要更改我使用的条件值,如果任何符号等于我需要替换的单词,它就会这样做,但我似乎效率不高。