我想试试写个defun宏以尝试理解,有点疑问(当然先谷歌了):
(defvar a ‘apple)
``(,,a) => `(,apple)
有没有办法得到
`(apple)
还是说这没有意义? 因为``说明了在两层了,在第一层获取值没有意义?
我能不能把这些用到这些宏符号的表达式反过来转化为比较”死板“的普通表达式?
(可能是我没想到合适的关键字,谷歌没找到) 例如:
’a => (quote a)
`(a b ,c) => (list (quote a) (quote b) c)
另外一个疑问是,理论上 macro 是在前面运行的,那为什么不能:
(defun plus (a b) (+ a b))
(defmacro test () ''plus)
((test) 5 6) ;;Error
而只能:
(eval `(,(test) 5 6))
理论上
((test) 5 6)
应该在编译前就变成了:
(plus 5 6)
我估计是一种约定?不同的方言可能不一样 ?
例如参考 Scheme 的 JavaScript 可以 fn()()()() 这种形式( Ramda.js 默认他的所有函数都是这样curry),估计 Scheme 也可以,而Common Lisp 觉得这样没必要。。。
但我觉得有的话更简便?就像 JS6 有了 fn(…x) 语法后不用再用 fn.apply(nil, x) 了