一千萬個為什麽

搜索

如何給cond列表?

我們有一些條款(條件體)我們想給 cond ,就像這樣:

(cond (condition1 body1)
      (condition2 body2)
      (condition3 body3))

但想象一下,這些子句首先是通過 mapcar 生成的,它給出了以下列表:

((condition1 body1)
 (condition2 body2)    
 (condition3 body3))

假設上面的列表是變量子句的內容。 現在,我們想將它傳遞給 cond ,但是如果我們執行以下操作:

`(cond ,clauses)

它導致:

(cond ((condition1 body1)
       (condition2 body2)
       (condition3 body3)))

哪個不起作用,而不是:

(cond (condition1 body1)
      (condition2 body2)
      (condition3 body3))

有沒有解決這個問題的方法?

最佳答案

您希望將列表拼接到新表單中:

`(cond ,@clauses)

See C-hig (elisp) Backquote RET

您還可以將評估值“拼接”到結果列表中,   使用特殊標記,@ 。拼接列表的元素成為   與結果列表的其他元素處於同一級別的元素。   不使用`的等效代碼通常是不可讀的。這是   一些例子:

     (setq some-list '(2 3))
          ⇒ (2 3)
     (cons 1 (append some-list '(4) some-list))
          ⇒ (1 2 3 4 2 3)
     `(1 ,@some-list 4 ,@some-list)
          ⇒ (1 2 3 4 2 3)

     (setq list '(hack foo bar))
          ⇒ (hack foo bar)
     (cons 'use
       (cons 'the
         (cons 'words (append (cdr list) '(as elements)))))
          ⇒ (use the words foo bar as elements)
     `(use the words ,@(cdr list) as elements)
          ⇒ (use the words foo bar as elements)

轉載註明原文: 如何給cond列表?