Lisp/Scheme中的引号是否与字符串相同?

Lisp/Scheme中的引号是否与字符串相同?,scheme,lisp,Scheme,Lisp,关于Lisp中的quote,已经有很多问题了,我知道它不会对表达式求值。但我没有看到它与字符串的比较 引号是否与字符串相同? 如果没有,它们有什么不同?是一个特殊的操作符。 是一个类(该符号还命名一个函数)。 他们没有共同之处 都是 而且是 . 然而,“相似性”到此为止 引用表达式,不需要结束符 精确地引用,因为表达式必须有平衡的括号 引用文本,并且确实需要结束引用 例如,((“有效(lisp reader返回长度为3的字符串),但”((无效(读取器发出错误信号) 你应该得到一本口齿不清的书

关于Lisp中的quote,已经有很多问题了,我知道它不会对表达式求值。但我没有看到它与字符串的比较

引号是否与字符串相同? 如果没有,它们有什么不同?

是一个特殊的操作符。 是一个类(该符号还命名一个函数)。 他们没有共同之处

都是 而且是 . 然而,“相似性”到此为止

  • 引用表达式,不需要结束符 精确地引用,因为表达式必须有平衡的括号
  • 引用文本,并且确实需要结束引用
例如,
((“
有效(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重要的不一定是它们之间的相似之处,而是它们之间的不同之处。你可以引用