[英]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.