- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
Common lisp 有一些我无法理解的地方。
假设我正在编写一个与此类似的宏:
(defmacro test-macro ()
(let ((result (gensym)))
`(let ((,result 1))
(print (incf ,result)))))
我能做到
> (test-macro)
2
2
现在我想看看它是如何展开的
> (macroexpand-1 '(test-macro))
(LET ((#:G4315 1)) (PRINT (INCF #:G4315))) ;
T
好的。有使用 gensym 生成的独特符号,这些符号被打印为 uninterned。
据我所知,uninterned 符号是求值器不会在内部创建符号数据绑定(bind)的符号。
因此,如果我们宏扩展到该形式,(incf#:G4315) 应该会出现错误。为了测试这一点,我们可以在 REPL 中评估该表单:
> (LET ((#:G4315 1)) (PRINT (INCF #:G4315)))
*** - SETQ: variable #:G4315 has no value
那么为什么扩展到这个字符串的宏可以完美地工作而表单本身却不能呢?
最佳答案
符号可以驻留在包中,也可以不驻留。 驻留在包中的符号可以被查找和找到。无法在包中查找 uninterned 符号。一个包中只能有一个特定名称的符号。只有一个符号CL-USER::FRED
。
你写:
So as far as I know the uninterned symbols are the symbols for which the evaluator does't create symbol-data binding internally.
这是错误的。 Uninterned symbols 是在任何包中都不是interned 的符号。否则他们完全没问题。 interned 表示在包的注册表 中为其符号注册。
s-expression reader 确实使用符号名称和包在阅读 期间识别符号。如果没有这样的符号,它将被保留。如果有,则返回这个。
读者确实在当前包中按名称查找符号:
(read-from-string "FOO") -> symbol `FOO`
第二次:
(read-from-string "FOO") -> symbol `FOO`
它始终是相同的符号 FOO
。
(eq (read-from-string "FOO") (read-from-string "FOO")) -> T
#:FOO
是名称为 FOO
的非内部符号的语法。它不存在于任何包中。如果读者看到这个语法,它会创建一个新的 uninterned 符号。
(read-from-string "#:FOO") -> new symbol `FOO`
第二次:
(read-from-string "#:FOO") -> new symbol `FOO`
两个符号不同。它们具有相同的名称,但它们是不同的数据对象。除了包之外,没有其他符号注册表。
(eq (read-from-string "#:FOO") (read-from-string "#:FOO")) -> NIL
因此在您的情况下 (LET ((#:G4315 1)) (PRINT (INCF#:G4315)))
,未实习的符号是不同的对象。第二个是不同的变量。
Common Lisp 有一种打印数据的方法,因此在打印/读取过程中可以保留标识:
CL-USER 59 > (macroexpand-1 '(test-macro))
(LET ((#:G1996 1)) (PRINT (INCF #:G1996)))
T
CL-USER 60 > (setf *print-circle* t)
T
CL-USER 61 > (macroexpand-1 '(test-macro))
(LET ((#1=#:G1998 1)) (PRINT (INCF #1#)))
T
现在您看到打印的 s 表达式的第一个符号有一个标签 #1=
。然后它稍后引用相同的变量。这可以被读回并保留符号标识 - 即使读者无法通过查看封装来识别符号。
因此宏创建了一个表单,其中只生成一个符号。当我们打印该表格并想读回它时,我们需要确保未保留符号的身份得到保留。使用 *print-circle*
设置为 T
的打印有助于做到这一点。
问:为什么我们使用 GENSYM
(generate symbol)在宏中使用 uninterned generate symbols?
这样我们就可以拥有独特的新符号,这些符号不会与代码中的其他符号发生冲突。他们通过函数 gensym
获得一个名字——通常在末尾有一个计数。由于它们是未驻留在任何包中的全新符号,因此不会有任何命名冲突。
CL-USER 66 > (gensym)
#:G1999
CL-USER 67 > (gensym)
#:G2000
CL-USER 68 > (gensym "VAR")
#:VAR2001
CL-USER 69 > (gensym "PERSON")
#:PERSON2002
CL-USER 70 > (gensym)
#:G2003
CL-USER 71 > (describe *)
#:G2003 is a SYMBOL
NAME "G2003"
VALUE #<unbound value>
FUNCTION #<unbound function>
PLIST NIL
PACKAGE NIL <------- no package
关于lisp - Uninterned symbols 符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13987064/
给定一个字符串,例如 s="##$$$#",我如何找到索引之前的“#”符号数等于“”数的索引$"符号在索引之后? 示例:如果 s="##$$$#",则输出将为 2。 解释:在索引 2 之前我们有 2
在本教程中,您将借助示例了解 JavaScript 符号。 JavaScript 符号 JavaScript ES6 引入了一种新的原始数据类型,称为 Symbol(符号)。符号是不可变的(不能更改)
在“函数编程的工艺”一书中,符号 '>.>' 将函数连接在一起,与 '.' 的方向相反。但是当我使用 ghci 实现它时,它显示了超出范围的错误 '>.>'。为什么?它是不再使用的旧符号吗? 最佳答案
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我需要从向量中删除 \"。这是我的数据: data <- c("\"https://click.linksynergy.com/link?id=RUxZriH*PWc&offerid=323058.1
我在 Nginx 配置中使用正则表达式来捕获文件 URL,但如果文件 URL 包含 # 符号,正则表达式模式将不会捕获它。 这里是nginx的配置部分。 location ~ ^/p/(?[\w\-=
如何使 & 符号在此图表的第一组条形/列下正确显示: http://jsfiddle.net/VxbrK/2/ 应该是“Apples & Oranges”而不是“Apples & Oranges”。
**在verilog中是什么意思? 我为测试台提供了以下逻辑 localparam NUM_INPUT_BITS = 1; localparam NUM_OUTPUT_BITS
我有一个使用正则表达式来验证电子邮件地址的方法。 public String searchFormail(String searchWord) { Pattern pattern = Patt
我想将一个字符串拆分为数字部分和文本/符号部分我当前的代码不包含负数或小数,并且表现得很奇怪,在输出的末尾添加了一个空列表元素 import re mystring = 'AD%5(6ag 0.33-
我有一些代码需要从数组中选择一个随机字符串,但它一直返回单个字母或数字。如何解决这个问题? var name = ["Yayek", "Vozarut", "Gezex",
我刚开始使用 Python,我在考虑应该使用哪种表示法。我读过 PEP 8关于 Python 符号的指南,我同意那里的大多数内容,除了函数名称(我更喜欢混合大小写风格)。 在 C++ 中,我使用匈牙利
在用 C# 编写代码时,我错误地在 if 语句中的变量前添加了一个符号(而不是感叹号)。 bool b = false; if (@b) { } 我很惊讶它编译成功,没有任何错误。 我想知道:上面的代
本文实例为大家分享了特殊字符替换电话号码中某一部分的方法,ios利用-号替换电话号码中间四位,供大家参考,具体内容如下 1、效果图 2、代码 rootviewcontroll
当我使用“x”和“z”作为符号时,这段代码没有问题: from sympy import * x, z = symbols('x z') y = -6*x**2 + 2*x*z**0.5 + 50*x
我需要从文本中删除标点符号: data <- "Type the command AT&W enter. in order to save the new protocol on modem;"
我有几个数字是 numeric 类。下面的例子。 df = c(12974,12412,124124,124124,34543,4576547,32235) 现在我想在每个数字前添加 '$' 符号而不
我有一个 highcharts 图例,其中符号以不同的大小显示,因为它们在实际图表中的大小不同。不幸的是,当数据点的大小增加时,它们也会在图例中增加。无论数据点大小如何,我都希望图例符号保持相同的大小
我需要使用包含平均值+-SD的标题。到目前为止,我只能得到以下信息: "Mean +- SD or N (%)" [1] "Mean +- SD or N (%)" 如何直接使用“+-”符号?您知道一
使用 XSLT 和 XPath 1.0,我有一个要转义的字符串以用于 URL,例如: one word & another 因此,描述元素的 text() 应该进行 URL 转义。 我该怎么做
我是一名优秀的程序员,十分优秀!