问题标签 [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.

0 投票
2 回答
123 浏览

variables - 通过使用 SETF 定义变量来回避错误

全体人员,

我是坚持用 SETF 定义变量的类型之一。我已经升级到一台新机器(和一个新版本的 SBCL),它并没有让我侥幸逃脱(当然,我得到了适当的“==> undefined variable...”错误)

我的问题是,我已经编写了 20,000 行代码(错误地)用 SETF 定义我的变量,我不喜欢重写我的所有代码以让解释器消化所有代码的前景。

有没有办法关闭该错误以便解释可以继续?

任何帮助表示赞赏。

真挚地,

-托德

0 投票
1 回答
323 浏览

lisp - Lisp:找到与 fset 等效的 setf 方式

在 lisp中找到与fset等效的setf方式。

0 投票
1 回答
384 浏览

lisp - Setf 函数名称

阅读这个问题让我思考了什么是有效的汽车表达。显然,可以使用通常的语法“调用”符号和 lambda。根据hyperspec

函数名n. 1.(在一个环境中)一个符号或一个列表(setf 符号),它是那个环境中一个函数的名称。2. 一个符号或一个列表(setf 符号)。

所以,理论上,(setf some-name)是一个函数名。我决定试一试。

GNU CLISP、SBCL 和 ABCL 都会让我定义这个函数。但是,SBCL 和 ABCL 不允许我使用片段中显示的任何语法来调用它。另一方面,CLISP 将运行前两个,但在第三个仍然会出错。

我很好奇哪个编译器的行为正确。由于 SBCL 和 ABCL 同意,我会冒险猜测正确的实现应该拒绝该代码。作为第二个问题,我如何从代码片段中调用我令人难以置信的设计无用的函数,因为我上面尝试的东西不能移植。或者,也许更有用的是,

0 投票
1 回答
253 浏览

oop - 为什么泛型函数与访问函数 lisp 不同

从我读过的东西中,我了解到 CLOS 中的访问器函数允许程序员获取和设置变量,它会生成一个通用函数,该函数的名称是提供给访问器的,您需要定义不同的方法。但我是什么我想知道为什么泛型函数的工作方式与访问器函数不同?

例如

我可以定义

但是如果我要拿走访问器并添加

然后在执行以下代码后出现错误。

除非我将通用函数和方法重新定义如下

或执行

我的问题是为什么会发生这种情况?为什么我不能用泛型函数达到相同的结果?

0 投票
3 回答
279 浏览

common-lisp - 如何在 setf 地方执行功能

我有一个包含一些符号和值的列表。目标是使用访问器设置类槽,其符号由列表提供:

我试过通过宏:

这也失败了,因为to-call它是一个符号而不是一个列表。

  • eval不起作用,因为to-call它是一个词法变量;
  • 不可能let通过宏来给它列表;
  • 我已经尝试过with-slotswith-accessors但问题仍然存在,因为它们也是宏。
  • 我考虑过声明其他宏的宏,以及符号宏。

如何通过与列表中的符号对应的访问器设置插槽?

谢谢你。

0 投票
1 回答
442 浏览

common-lisp - (defun (setf …)) defsetf 和 define-setf-expander 的典型用例是什么

使用 Common Lisp 进行开发时,我们有三种可能性来定义新的setf形式:

  • 我们可以定义一个函数,其名称是两个符号的列表,第一个是setf,例如(defun (setf some-observable) (…))

  • 我们可以使用 的缩写形式defsetf

  • 我们可以使用 的长形式defsetf

  • 我们可以使用define-setf-expander.

我不确定每种可能性的正确或预期用例是什么。

对这个问题的回答可以暗示最通用的解决方案,并概述其他解决方案优于其他解决方案的上下文。

0 投票
1 回答
149 浏览

common-lisp - 如何在 common lisp 中编写 multf 函数

我正在寻找一种方法来修改属性列表中的属性值,方法是将其与给定因子相乘,类似于使用 incf 添加到值。

使用 incf 我可以说:

使用宏我可以通过以下方式获得结果,但这使用 getf 两次:

我将如何做到这一点,以便我可以只使用一次 getf 获得相同的结果?

也许有这个功能的包,但我在网上找不到。任何帮助表示赞赏!这不是功课,我只是想优化我的代码,我很想更好地理解这种语言。我读到了 setf-expanders 和 compiler-macros,但我不知道它们是否适用于这里以及如何使用它们。

0 投票
2 回答
155 浏览

lisp - 非破坏性修改哈希表

是否可以非破坏性地将新的键值对添加到 Common Lisp (SBCL) 哈希表中?向哈希表添加新元素的标准方法是调用:

但是对setf修改的调用会*hash-table*破坏原始文件。我有一个应用程序,我想利用哈希表查找的效率,但我也想非破坏性地修改它们。我看到的解决方法是在对其进行操作之前复制原始哈希表,但这在我的情况下是不切实际的,因为我正在处理的哈希表包含数千个元素并复制大型哈希表,例如循环将首先否定使用它们的计算效率优势。

0 投票
1 回答
113 浏览

set - 什么是 setf,它是 Dr.Racket 中的有效函数吗?

我有一个任务,我必须为表达式定义一个别名,在其中一个指南中,我们被告知使用 setf 或列表列表来定义它们。更具体地说,我们需要将它们的 lambda 演算值分配给别名 ADD/SUCC/PRED/etc,例如 ---> (ADD := (λ mnf x.nf (mfx))) <----。

这样,在任何给定操作中用别名替换它们之后,我们就可以操作它们。由于我没有找到任何明确的解释,而且我不知道如何继续使用 setf,所以如果你们中的任何人能给我一个小费,我会发现它真的很有帮助。

到目前为止,要更改我使用的条件值,如果任何符号等于我需要替换的单词,它就会这样做,但我似乎效率不高。