请问 Emacs 中有没有类似 python 中的 eval() 的方法,将字串视为命令执行?

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! :+1:

有两种办法。

一个是直接用 quasiquote。

(setq func 'message)
(setq arg "sth")
(eval `(,func ,arg))

一个是用 list 函数。

(eval (list func arg))

这两种写法都挺常见的(第一种更常见一些),视要求值的变量多少决定。

2 个赞

收到!!! :blush:豁然开朗!!!!
非常感谢! :pray:

试着写了个函数测试,得到了正确的结果!!!感谢大家帮忙答疑解惑!! :pray:

(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")