Quote '这个真心无法理解

看了好几篇文章,都不能理解,有没有大神能简单解释一下。

看了什么文章?不能理解什么?

不知道怎么用

http://smacs.github.io/elisp/05-cons-cell.html

lisp的‘吗?就是禁止对表达式求值呀,很好理解的。

你应该说清楚你具体是哪里不懂?还有自己的理解

「提问方法,你可以看论坛首页推荐的《提问的智慧》」

1 个赞

这个看起来挺清楚了,有例子比较好理解一点

我知道楼主哪里不懂 这个我也糊涂了很长时间 我试着用例子给你讲一讲:

首先 (quote a)'a是等价的 明显后者更容易写所以大都用后者

*scratch*里 在语句后面摁C-j就eval了这个语句 先定义一个变量a 比如用(setq a 1) 之后 如果直接打a并且按C-j 会出现1 而如果用'a会出现a 这就是加不加'的区别 是给它取值(不加') 还是把它自身返回(加')

类似的例子是(1 2 3) 如果你在这它后面C-j会出错 因为Emacs将它理解成一个函数调用 而这个函数是不存在的 所以报错 而'(1 2 3)就返回了(1 2 3)这个list

Emacs里执行代码和在*scratch*里按C-j是一样的 有什么不懂的在里面按一下就知道了 希望能帮到你

就是区分代码跟数据啊.

我把它理解成 list map ,和string 应该就可以了吧

:joy:不知道这俩是啥

我感觉这种理解似乎不太对, quote 不是禁止求值,而是求值,但返回值是其本身

我感觉,你单纯从字面上来理解 quote, 确实很难理解,但如果你从函数式编程求值规则的一些惯例来理解,可能就更加容易,

(xxx  (a b c))

上面的表达式求值时,先对 (a b c) 求值,然后在 求值 (xxx 返回值), 如果你需要处理一个列表本身,那必须要 求值得到的返回值是其本身 的一个操作符,所以就引入的 quote

比如a已经被赋值为3, (print a) ;3 (print 'a) ;a 你说哪种是禁止求值?

(print `(a)) ;(a) (print `(,a)) ;(3) 你说哪种是求值?(这里用~下面的‘)

如果我说, 都求值,只不过求值规则不同, a 是作为变量,来获取它的变量值,而 'a 求值得结果是 a 这个符号。

这两个和 quote 没什么关系, 这个叫 backquote ,是比较高层次的东西了, 是建立在 lisp 底层功能上面的一种模板语言,虽然她只有 · , @ 三个操作符