2008-12-04 118 views
5

計劃宏可以宏被寫入方案(與define-syntax,例如)將採取類似這樣的表述:嵌套表達式

(op a b c d e f g h i j) 

和產量的表情像這樣的輸出?

(op (op (op (op (op (op (op (op (op a b) c) d) e) f) g) h) i) j) 

當然,對於任意長度。我不能想辦法做到這一點,給予一定的模板是這樣的:

(define-syntax op 
    (syntax-rules() 
    [(_) 'base-case] 
    [(v1 v2 ...) 'nested-case??])) 
+0

我很好奇。這只是一個理論上的興趣問題,還是你有一個有趣的用例?一般來說,這種包裝將通過foldLeft來實現。 – namin 2008-12-04 20:34:39

+0

嗯,好點。我主要問這個,因爲我沒有想到你的方式= P。我沒有意識到這正是foldl所做的。 – Claudiu 2008-12-10 20:32:20

回答

6
(define bop list) 

(define-syntax op 
    (syntax-rules() 
    ((op a b) (bop a b)) 
    ((op a b c ...) (op (bop a b) c ...)))) 

例如,(op 1 2 3 4)擴展到(bop (bop (bop 1 2) 3) 4)和計算結果爲(((1 2) 3) 4)

0

要顯示的答案是如何工作的:

(op 1 2 3 4) 

這與4條語句的運算,所以第二殼體被與= 1選擇的,B = 2,C = 3,... = 4:

(op (bop 1 2) 3 4) 

這是一個有3個語句的操作,所以第二個例子再次。 A =(BOP 1 2),B = 3,C = 4:

(op (bop (bop 1 2) 3) 4) 

現在,這是用2條語句,所以A =(BOP(BOP 1 2)3)中,b = 4,和一個BOP完成。

1

要應用於參數的函數本身應該是宏的參數。除此之外,我的解決方案是一樣的。

#!r6rs 

(import (rnrs base)) 

(define-syntax claudiu 
    (syntax-rules() 
    ((claudiu fun first second) 
    (fun first second)) 
    ((claudiu fun first second rest ...) 
    (claudiu fun (claudiu fun first second) rest ...))))