如何根据elisp中的一个条件设置一组变量?
假设我想根据一个条件设置如何根据elisp中的一个条件设置一组变量?,lisp,elisp,Lisp,Elisp,假设我想根据一个条件设置bar和baz的值,这两种情况下都是相同的,比如foo的值。使用let特殊形式,我可以这样做 (let ((bar (if foo 1 2)) (baz (if foo 3 4))) ... ) 虽然上面的程序是正确的,但它检查foo的值两次似乎有点奇怪。在这种情况下,有没有一个惯用的表达式可以用来避免重复检查?您可以使用cl lib.el提供的多个值,这是Emacs的常见Lisp扩展: 您可能希望在单独的函数中提取这两种情况。您可以使用cl lib.e
bar
和baz
的值,这两种情况下都是相同的,比如foo
的值。使用let特殊形式,我可以这样做
(let ((bar (if foo 1 2))
(baz (if foo 3 4)))
... )
虽然上面的程序是正确的,但它检查
foo
的值两次似乎有点奇怪。在这种情况下,有没有一个惯用的表达式可以用来避免重复检查?您可以使用cl lib.el
提供的多个值,这是Emacs的常见Lisp扩展:
您可能希望在单独的函数中提取这两种情况。您可以使用
cl lib.el
提供的多个值,这是Emacs的常见Lisp扩展:
您可能希望在单独的函数中提取这两种情况。我在elisp中能想到的唯一答案(没有多个值)是这样的:
(apply (lambda (bar baz)
...)
(if foo
(list 1 2)
(list 3 4)))
一般来说,这是consy,不过显然,在可以提供文本列表的情况下,不需要这样做
你可以把它包装成一个宏:下面就是这样,尽管它非常需要一些错误检查(elisp太烦人了,我不想在上面花更多的时间——至少现在它有回溯)
然后表达式将变成(这次使用文本列表)
在elisp中我能想到的唯一答案(没有多个值)是这样一个非常可怕的东西:
(apply (lambda (bar baz)
...)
(if foo
(list 1 2)
(list 3 4)))
一般来说,这是consy,不过显然,在可以提供文本列表的情况下,不需要这样做
你可以把它包装成一个宏:下面就是这样,尽管它非常需要一些错误检查(elisp太烦人了,我不想在上面花更多的时间——至少现在它有回溯)
然后表达式将变成(这次使用文本列表)
您不必在let表单本身中设置值。let表单创建本地绑定,然后可以根据需要设置值
(let(bar baz)
(如果是foo
(设定值1)
baz(2)
(设定值3)
baz(4))
...)
您无需在let表单本身中设置值。let表单创建本地绑定,然后可以根据需要设置值
(let(bar baz)
(如果是foo
(设定值1)
baz(2)
(设定值3)
baz(4))
...)
(defmacro plet (vars-vals &rest forms)
`(apply (lambda ,(car vars-vals)
,@forms)
,(cadr vars-vals)))
(plet ((bar baz) (if foo '(1 2) '(3 4)))
...)