Pas*_*ten 0 lisp emacs function
我想创建一个nil函数,它接受任意数量的符号并将它们全部设置为nil.
(defun clean (as many args as given by user)
(setq each-arg nil)
)
(clean x y z)
Run Code Online (Sandbox Code Playgroud)
怎么做'干净'?
既然你没有引用参数,它必须是一个宏:
(defmacro clean (&rest symbols)
`(progn
,@(mapcar (lambda (sym) (list 'setq sym 'nil))
symbols)))
Run Code Online (Sandbox Code Playgroud)
小智 5
与德米特里相似,但产生的代码略少:
(defmacro clean (&rest variables)
`(setq ,@(loop for var in variables nconc (list var nil))))
(macroexpand '(clean a b c d))
;; (setq a nil b nil c nil d nil)
Run Code Online (Sandbox Code Playgroud)
关于你的其他问题:
简单但耗时的方法是将点移动到你不知道的函数,C-h f或者M-xdescribe-function这将把函数名放在提示符中(如果它确实是一个Emacs Lisp函数)并显示描述,如果有效地在源代码中的位置.
我会尝试解释,但我没有语言参考:)
defmacro - 类似于函数,但它不评估参数.读取代码并将其编译为字节码时,将执行宏.他们的主要目标是生成其他代码.lambda - 是一个创建匿名函数并返回它的宏.mapcar - 是一个高阶函数,它将函数连续应用于列表的所有元素,并按照应用函数的顺序将结果收集到列表中.&rest - 是函数的lambda-list中的一个特殊关键字(即参数的定义),字面意思是该符号后面的标识符是右边所有参数的列表).,@是一个特殊的运算符,用于宏,在反引号宏内.它指示读者必须评估其后面的表达式,将其视为列表,并且必须将其所有的conses附加到当前正在解析的表单.