簡體   English   中英

和宏修改

[英]And macro modification

(define-macro and
  (lambda args
     (if (null? args) ‪#‎t‬
         (if (null? (cdr args)) (car args)
             (if (car args) `(and ,@(cdr args)) ‪#‎f‬)))))

這是經過修改的宏,與最后一行不同。 我知道正確的正確方法是

  `(if ,(car args) (and ,@(cdr args)) ‪#‎f‬)))))

但是我不知道該更改將如何影響此宏的行為。我認為它的作用相同,但是如果不起作用,可以舉個例子說明何時不行嗎? enter code here

因此,您具有宏擴展時間,並且具有運行時。 讓我們想象一下,我(and (pair? lst) (cdr lst))使用了and的第一個定義。 有效的代碼是(if (car args) `(and ,@(cdr args)) ‪#‎f‬))和args是((pair? lst) (cdr lst)) 宏擴展時間中的(car args)(pair? lst) ,它不是#f(除了#f以外的任何東西都為true),但是請注意,您沒有在運行(pair? lst) ,您只是在確保我沒有寫過(and #f something) 函數中運行的代碼需要編寫代碼,並且在運行時沒有數據,而是具有源代碼中表示的參數。

通過將最后一行更改為`(if ,(car args) (and ,@(cdr args)) ‪#‎f‬)))))您不再檢查數據(pair? lst)是否為#f,但是它會變成(if (pair? lst) (and (cdr lst)) #f)並且在運行時if會基於lst做結果或替代。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM