Lisp/Scheme中的引号是否与字符串相同?
关于Lisp中的quote,已经有很多问题了,我知道它不会对表达式求值。但我没有看到它与字符串的比较 引号是否与字符串相同? 如果没有,它们有什么不同?是一个特殊的操作符。 是一个类(该符号还命名一个函数)。 他们没有共同之处 都是 而且是 . 然而,“相似性”到此为止Lisp/Scheme中的引号是否与字符串相同?,scheme,lisp,Scheme,Lisp,关于Lisp中的quote,已经有很多问题了,我知道它不会对表达式求值。但我没有看到它与字符串的比较 引号是否与字符串相同? 如果没有,它们有什么不同?是一个特殊的操作符。 是一个类(该符号还命名一个函数)。 他们没有共同之处 都是 而且是 . 然而,“相似性”到此为止 引用表达式,不需要结束符 精确地引用,因为表达式必须有平衡的括号 引用文本,并且确实需要结束引用 例如,((“有效(lisp reader返回长度为3的字符串),但”((无效(读取器发出错误信号) 你应该得到一本口齿不清的书
- 引用表达式,不需要结束符 精确地引用,因为表达式必须有平衡的括号
- 引用文本,并且确实需要结束引用
((“
有效(lisp reader返回长度为3的字符串),但”((
无效(读取器发出错误信号)
你应该得到一本口齿不清的书(例如。,
或
)并努力解决它。
它会更有效率。是一个特殊的操作员。
是一个类(该符号还命名一个函数)。
他们没有共同之处
都是
而且是
.
然而,“相似性”到此为止
- 引用表达式,不需要结束符 精确地引用,因为表达式必须有平衡的括号
- 引用文本,并且确实需要结束引用
((“
有效(lisp reader返回长度为3的字符串),但”((
无效(读取器发出错误信号)
你应该得到一本口齿不清的书(例如。,
或
)并努力解决它。
它将更加高效。在Lisp中:
* (type-of "a b c")
(SIMPLE-ARRAY CHARACTER (5))
* (type-of '(a b c))
CONS
* (type-of "(a b c)")
(SIMPLE-ARRAY CHARACTER (7))
字符串始终是某种string
类型的对象。字符串的计算结果始终为自身
quote
操作符返回被引用的对象-无论该对象是什么:一个字符串
,一个数字
,一个符号
,一个由cons
单元格组成的列表
CL-USER 2 > '"a b c"
"a b c"
CL-USER 3 > '3
3
CL-USER 4 > 'abc
ABC
CL-USER 5 > '(a b c)
(A B C)
在Lisp中:
* (type-of "a b c")
(SIMPLE-ARRAY CHARACTER (5))
* (type-of '(a b c))
CONS
* (type-of "(a b c)")
(SIMPLE-ARRAY CHARACTER (7))
字符串始终是某种string
类型的对象。字符串的计算结果始终为自身
quote
操作符返回被引用的对象-无论该对象是什么:一个字符串
,一个数字
,一个符号
,一个由cons
单元格组成的列表
CL-USER 2 > '"a b c"
"a b c"
CL-USER 3 > '3
3
CL-USER 4 > 'abc
ABC
CL-USER 5 > '(a b c)
(A B C)
单引号后跟一个值的书面表示将产生该值: 示例:
”(1 x“foo”)
将生成一个打印为(1 x“foo”)
的值
假设现在我不想在列表中使用文字符号x
。我的程序中有一个变量x
,我想插入x
的值
为了标记我想要的是x
的值,而不是符号x
,我在x
之前插入了一个逗号:
'(1 ,x "foo")
它不会像现在这样工作-我现在得到一个值,它有一个文字逗号和一个符号x
。问题是quote不知道逗号约定
Backtick或backquote了解逗号约定,这将给出正确的结果:
> `(1 ,x "foo")
(1 3 "foo") ; if the value of x is 3
现在字符串和符号不是一回事了。区别在于符号是内部的。这意味着一次只有一个符号的副本
在(list'foo'foo)
中,您将得到一个包含相同符号两次的列表。
换句话说,(eq?'foo'foo)
是正确的
另一方面,在
(list(string#\a)(string#\a))
中,您生成两个字符串,每个字符串包含字符a。但是,您得到两个不同的字符串。因此,对其中一个字符串进行变异不会改变另一个字符串。值的书面表示形式后面加上一个引号将生成该值:
示例:”(1 x“foo”)
将生成一个打印为(1 x“foo”)
的值
假设现在我不想在列表中使用文字符号x
。我的程序中有一个变量x
,我想插入x
的值
为了标记我想要的是x
的值,而不是符号x
,我在x
之前插入了一个逗号:
'(1 ,x "foo")
它不会像现在这样工作-我现在得到一个值,它有一个文字逗号和一个符号x
。问题是quote不知道逗号约定
Backtick或backquote了解逗号约定,这将给出正确的结果:
> `(1 ,x "foo")
(1 3 "foo") ; if the value of x is 3
现在字符串和符号不是一回事了。区别在于符号是内部的。这意味着一次只有一个符号的副本
在(list'foo'foo)
中,您将得到一个包含相同符号两次的列表。
换句话说,(eq?'foo'foo)
是正确的
另一方面,在
(list(string#\a)(string#\a))
中,您生成两个字符串,每个字符串包含字符a。但是您得到两个不同的字符串。因此,对其中一个字符串进行变异不会改变另一个字符串。引号意味着返回符号表达式本身,而不计算它
例如:
'1 => 1
'"abc" => "abc"
'sym => sym << here the sym is not evaluated as a variable,
but it is returned the symbol itself.
'(+ 1 1) => (+ 1 1)
如果你问一个符号是否也是字符串,你的问题会更有趣。答案是否定的
您应该阅读并理解它的含义。引号的意思是返回符号表达式本身,而不计算它 例如:
'1 => 1
'"abc" => "abc"
'sym => sym << here the sym is not evaluated as a variable,
but it is returned the symbol itself.
'(+ 1 1) => (+ 1 1)
如果你问一个符号是否也是字符串,你的问题会更有趣。答案是否定的
您应该阅读并理解其含义。中探讨了带S-expr的准旋转与字符串替换之间的关系。中探讨了带S-expr的准旋转与字符串替换之间的关系。抱歉,我没有清楚地表达自己的意思。我不是指函数或运算符
引号
或函数string
。我指的是被“
引用后的东西,以及被”
括起来的东西。后者显然与其他语言的字符串相同,前者似乎与我相似。@WeiHuang重要的不一定是它们之间的相似之处,而是它们之间的不同之处。你可以引用