eval-expression. 不过这不是正常的做法。正常的做法是变量里存一个list (严格来说叫cons),这个list的内容就是一段程序。然后直接eval这个变量对应dlist。
1 个赞
(eval (read xxx))
2 个赞
eval
函数最早就是 1958 年出现在 LISP 里的 [1]。
直译的话是
(setq the-str "just print sth")
(setq the-cmd "(message the-str)")
(eval (read the-cmd))
然而 Lisp 里没人会把代码编码成字符串,大家都直接用列表了。
(setq the-str "just print sth")
(setq the-cmd '(message the-str))
(eval the-cmd)
[1] “The Implementation of LISP” The implementation of LISP
3 个赞
感谢! 我刚接触 lisp 不久 ,很多地方还转不过弯来!
想请教一下: (setq the-cmd '(message the-str)) 这样的形式,message 的位置只能写实吗? 是否有办法引用一个变量的值?或代入函数的参数?比如下面这样的思路:
(progn
(setq func "message ")
(setq arg "sth")
(setq ls '(func arg))
(eval ls)
)
比如在python中有这样的实现
func = "print"
arg = "blove"
eval(func + "(\"" + arg + "\")")
那么 lisp 中可以有类似的实现方法吗?
感谢!!!!!!
感谢!! 帮我进一步加深理解了list!
有两种办法。
一个是直接用 quasiquote。
(setq func 'message)
(setq arg "sth")
(eval `(,func ,arg))
一个是用 list
函数。
(eval (list func arg))
这两种写法都挺常见的(第一种更常见一些),视要求值的变量多少决定。
2 个赞
收到!!! 豁然开朗!!!!
非常感谢!
(defun blove/cmd(the-cmd the-args buf-name)
"command template"
(interactive)
(let ((buf (get-buffer-create (concat "*" buf-name "*"))))
(with-current-buffer buf
(erase-buffer)
(eval (list the-cmd the-args buf))
)
(pop-to-buffer buf t)
)
)
;;; use it
(blove/cmd #'shell-command "python -V" "Out")