假设我想设置bar
和baz
的值,具体取决于一种情况,两种情况都是相同的,比如foo
的值。使用let
特殊形式,我做这样的事情如何根据elisp中的一个条件设置一堆变量?
(let ((bar (if foo 1 2))
(baz (if foo 3 4)))
...)
虽然上面的程序是正确的,这似乎有些奇怪,因为它会检查foo
值的两倍。在这种情况下可以使用一种习惯用语来避免复查吗?
假设我想设置bar
和baz
的值,具体取决于一种情况,两种情况都是相同的,比如foo
的值。使用let
特殊形式,我做这样的事情如何根据elisp中的一个条件设置一堆变量?
(let ((bar (if foo 1 2))
(baz (if foo 3 4)))
...)
虽然上面的程序是正确的,这似乎有些奇怪,因为它会检查foo
值的两倍。在这种情况下可以使用一种习惯用语来避免复查吗?
你不必在咱们形式本身设置的值。 let表单创建本地绑定,然后您可以根据需要设置值。
(let (bar baz)
(if foo
(setq bar 1
baz 2)
(setq bar 3
baz 4))
...)
您可以使用cl-lib.el
提供的多个值,则Common Lisp的扩展Emacs的:
(multiple-value-bind (bar baz)
(if foo (values 1 3) (values 2 4))
...)
您可能希望在单独的函数来提取这两种情况。
我能想到的elisp的(没有多个值)的唯一的答案是什么,而可怕的是这样的:
(apply (lambda (bar baz)
...)
(if foo
(list 1 2)
(list 3 4)))
这是consy一般,但是,显然不一定是在良好的情况下,你可以提供文字列表。
你可以在宏把这个包:以下是这样的,虽然它迫切需要的一些错误检查(elisp的是太讨厌写我想花更多的时间比这一点 - 至少它有反引号现在)。
(defmacro plet (vars-vals &rest forms)
`(apply (lambda ,(car vars-vals)
,@forms)
,(cadr vars-vals)))
然后你的表情会成为(使用文字列表这个时候)
(plet ((bar baz) (if foo '(1 2) '(3 4)))
...)