看了好几篇文章,都不能理解,有没有大神能简单解释一下。
看了什么文章?不能理解什么?
不知道怎么用
lisp的‘吗?就是禁止对表达式求值呀,很好理解的。
你应该说清楚你具体是哪里不懂?还有自己的理解
「提问方法,你可以看论坛首页推荐的《提问的智慧》」
这个看起来挺清楚了,有例子比较好理解一点
我知道楼主哪里不懂 这个我也糊涂了很长时间 我试着用例子给你讲一讲:
首先 (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 应该就可以了吧
不知道这俩是啥
我感觉这种理解似乎不太对, 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 底层功能上面的一种模板语言,虽然她只有 · , @ 三个操作符