【Scheme】Scheme 編程學(xué)習(xí) (七) —— Macros 宏
原視頻地址: https://www.bilibili.com/video/BV1Kt411R7Wf?p=7
Macros in scheme
Scheme 語(yǔ)言中的宏,一般我們會(huì)在各種編程語(yǔ)言中見(jiàn)到宏,在 Scheme 中也是同樣的 idea
I - 問(wèn)題 (The problem)
(define num 3)
; 定義符號(hào) num 為 3
(cond
((zero? num) (display "Z"))
((positive? num) (display "P"))
(else (display "N")))
設(shè)置一個(gè)條件判斷,如果 num 為 0 ,則打印 Z (z 代表 zero 零),若為正數(shù)則打印 P (p 代表 positive 正數(shù)) , 其他則打印 N (n 代表 negative 負(fù)數(shù))
II - 隱藏復(fù)雜度 (Hiding complexity)
- How can we avoid repeating ourselves?
如何避免重復(fù),編程通用的方式是 DRY (don’t repeat yourself 不要重復(fù)你自己) - How can we speak at the right level?
如何在一個(gè)高的層面 (in a high level) 使用 Scheme
避免重復(fù)的原因是,我們一次表達(dá)出了一個(gè)概念 (express a concept),我們不需要在每次使用的時(shí)候都重新表達(dá)這個(gè)概念 (without re-express it every time),另一種原因是,我們不必要去思考底層實(shí)現(xiàn) (implementation),轉(zhuǎn)而去思考更高層面的問(wèn)題。
僅用代碼實(shí)現(xiàn)一次 (code your concept once),其他時(shí)候只需要引用 (refer to) 它,這里我們希望做的事是避免 (avoid) 重復(fù)代碼中的條件表達(dá)式 (cond expression),do once and leave it alone.
在編程語(yǔ)言中 (In program languages), 有多種方式 (several way) 來(lái)實(shí)現(xiàn)
- Functions 編寫(xiě)函數(shù)
- Classes 使用類(lèi)
- Extending the language 擴(kuò)展語(yǔ)言
- Code generation 程序生成代碼
(比如 Qt 擴(kuò)展了 C++,并在編譯時(shí)使用元對(duì)象系統(tǒng)生成 moc 相關(guān)的C++代碼) - Macros 宏
- Code generation 程序生成代碼
III - 初次嘗試 (First attempt)
(define (3-state
value
positive-body
zero-body
negative-body)
(cond
((zero? value) zero-body)
((positive? value) positive-body)
(else negative-body)))
我們定義一個(gè)函數(shù) 3-state 需要四個(gè)入?yún)?value, positive-body, zero-body, negative-body
這個(gè)函數(shù)體是一個(gè)條件表達(dá)式 (cond expression)
嘗試調(diào)用
(3-state
100 (display "P") (display "Z") (display "N"))
; PZN
這種方式定義與調(diào)用會(huì)執(zhí)行所有的 Scheme 語(yǔ)句,所以我們無(wú)法直接定義函數(shù)來(lái)實(shí)現(xiàn)。
IV - 解決方案 (A solution)
因此我們需要定義宏 (macros),定義 syntax ,
(define-syntax
3-state
(syntax-rules ()
((3-state
value positive-body zero-body negative-body)
(cond
((zero? value) zero-body)
((positive? value) positive-body)
(else negative-body)))))
第二個(gè)參數(shù)為 syntax-rules ,這里是需要做的匹配和需要擴(kuò)展的模板 (the matching you should do, the template you should expand), 使用模式匹配 (pattern),并使用內(nèi)容替換 (substitute in code)
> (3-state
100 (display "P") (display "Z") (display "N"))
; P
調(diào)用
> (3-state
0 (display "P") (display "Z") (display "N"))
; Z
> (3-state
-100 (display "P") (display "Z") (display "N"))
; N
V - 其他的實(shí)現(xiàn)方式 (How else could we do this?)
在其他語(yǔ)言中如何實(shí)現(xiàn)
5.1 - 宏 (Macros)
在 C 中使用 Macros 舉例如下
/* MACROS */
#define THREESTATE(VALUE,PBODY,ZBODY,NBODY) \
{\
int v = (VALUE); \
if (v == 0) { (ZBODY); }\
else if (v > 0) { (PBODY); }\
else { (NBODY); }\
}
int main()
{
THREESTATE(3, print("P\n"), print("Z\n"), print("N\n"));
return 0;
}
macros 為 literal expression 無(wú)法調(diào)試 (debug),
如何在 scheme 中使用 substitute
5.2 - 引用 (Quoting)
這是一部分 JavaScript 代碼,函數(shù)體使用字符串來(lái)定義 (body express in strings),通過(guò) eval 函數(shù)來(lái)調(diào)用。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-736473.html
function threeState( value, pbody, zbody, nbody )
{
if (value === 0) { eval( zbody ); }
else if (value > 0) { eval( pbody ); }
else { eval( nbody ); }
}
threeState(
3, "print('P')", "print('Z')", "print('N')" );
5.3 - 函數(shù)指針 (Function pointers)
def three_state(
value, p_body_fn, z_body_fn, n_body_fn):
if value == 0: z_body_fn()
elif value > 0: p_body_fn()
else: n_body_fn()
def pr( x ):
def ret():
print x
return ret
three_state(3, pr("P"), pr("Z"), pr("N"))
5.4 - 類(lèi) (class)
class TestJava {
interface IThreeStateBodies {
void positiveBody();
void zeroBody();
void negativeBody();
}
static void threeState(
int value, IThreeStateBodies bodies ) {
if ( value == 0 ) bodies.zeroBody();
else if ( value > 0 ) bodies.positiveBody();
else bodies.negativeBody();
}
public static void main( String[] args ) {
threeState( 3,
new IThreeStateBodies() {
public void positiveBody() {
System.out.println( "P" );
}
public void zeroBody() {
System.out.println( "Z" );
}
public void negativeBody() {
System.out.println( "N" );
}
}
);
}
Java 通過(guò)定義 Interface文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-736473.html
到了這里,關(guān)于【Scheme】Scheme 編程學(xué)習(xí) (七) —— Macros 宏的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!