Mik*_*H-R 1 emacs elisp destructuring
我有一个操作符,操作变量列表,如下所示:
(myfunc arg1 nil arg2 arg3)
Run Code Online (Sandbox Code Playgroud)
我需要选择(依赖于我们将调用的布尔变量my_bool)向该列表添加一个额外的参数,以便函数调用如下所示:
(myfunc arg1 nil arg2 added_argument arg3)
Run Code Online (Sandbox Code Playgroud)
我的第一个想法是使用if块这样做:
(myfunc arg1 nil arg2 (if mybool t nil) arg3)
Run Code Online (Sandbox Code Playgroud)
但是如果mybool等于nil函数语法不允许的话,那将导致nil .
我的第二个想法是,也许我们可以过滤列表为nil并删除它,但我们无法因为首先出现的nil(或者说我想不出办法,我很乐意被证明是错误的,只是寻找解决方案).
我的第三个想法是,如果我们有像红宝石那样的splat操作符'我们可以过滤然后splat,所有都将被整理出来,所以这样:
(myfunc arg1 nil (mysplat arg2 (filter (!= nil) (if mybool t nil)))) arg3)
Run Code Online (Sandbox Code Playgroud)
但是我找不到splat运算符(技术上更像是一个列表解构运算符)(PS上面的代码是近似的,因为它是一个不起作用的解决方案,所以我确定在那里.
所以我的问题是如何可选地向函数调用添加单个参数,如果不这样做,则不会产生nil作为该参数.
在此先感谢,对不起我的新秀emacs lisp技能:(.
您可以,@在反引号内使用splice运算符:
`(arg1 nil arg2 ,@(if my-bool (list added-argument) nil) arg3)
Run Code Online (Sandbox Code Playgroud)
也就是说,如果my-bool为true,则拼接在列表(list added-argument)中间创建的列表,否则拼接nil- 这是空列表,因此不添加任何元素.有关详细信息,请参阅Emacs Lisp手册的Backquote部分.
(一旦你创建了这个名单,它看起来像你需要使用apply呼叫myfunc使用的参数个数可变:(apply 'myfunc my-list))
| 归档时间: |
|
| 查看次数: |
482 次 |
| 最近记录: |