簡體   English   中英

為什么此語法可以模式化此“ for”宏?

[英]why this syntax can pattern this “for” macro?

#lang racket
(define-syntax for
  (syntax-rules ()
    ((_ list 'as element body ...)
     (map (lambda (element)
            body ...)
          list))))

>(對於'(0 1 2 3 4)'in i(print i)(換行符))

=> 0 1 2 3 4'(#####)

我的問題是,為什么“中的符號可以將符號”表示為? “ in”符號不是“ in”的唯一模式嗎?

在球拍文檔中, 有時會說

模板用來代替與模式匹配的形式,只是模板中每個模式變量實例被替換為使用匹配的模式變量的宏部分。

這讓我認為'as符號被忽略了。 確實,這

(define-syntax for
  (syntax-rules ()
    ((_ list element body ...)
     (map (lambda (element)
            body ...)
          list))))
(for '(0 1 2 3 4) i (print i) (newline))

效果也一樣。

要獲得所需的行為,請使用

(define-syntax for
  (syntax-rules (as)
    ((_ list as element body ...)
     (map (lambda (element)
            body ...)
          list))))

然后

>  (for '(0 1 2 3 4) as i (print i) (newline))
0
1
2
3
4
'(#<void> #<void> #<void> #<void> #<void>)

>  (for '(0 1 2 3 4) in i (print i) (newline))    
for: bad syntax in: (for (quote (0 1 2 3 4)) in i (print i) (newline))

不評估宏模式。 特別地, 'as 不是符號。 它只是列表(quote as) 'as 計算為一個符號,但它本身不是一個符號)。因此,您的宏真的是一樣的:

(define-syntax for
  (syntax-rules ()
    ((_ list (quote as) element body ...)
     (map (lambda (element)
            body ...)
          list))))

其中quoteas是可以匹配任何內容的模式變量。

如uselpa的回答中所述,要求使用與書面as完全相同的正確方法是使用文字列表:

(define-syntax for
  (syntax-rules (as)
    ((_ list as element body ...)
     (map (lambda (element)
            body ...)
          list))))

或者,如果您真的很虐待狂並且想讓用戶用as引用,請執行以下操作:

(define-syntax for
  (syntax-rules (quote as)
    ((_ list 'as element body ...)
     (map (lambda (element)
            body ...)
          list))))

(是的,您甚至可以將文字列表更改為'as而不是我所擁有的(quote as) ,但這只會使您的宏不可讀。請勿這樣做。:-P)

暫無
暫無

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

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