此中,f x會出現毛病,f不能當做運算元利用,而g(x), g x 都可以執行。但如許的運算結果准確嗎?是我們要的成效嗎?再看另一個實驗:
primarydef a dotprod b = xpart a * xpart b + ypart a* ypart b enddef;
suffix則是傳入變數名稱,因為變數名稱使用前必進行宣佈變數型態,所以利用它可以確保傳入的變數形態准確。
vardef a[]b(text t)= show (#@,@); enddef;
這樣一來,z 和 d就會被傳入的值庖代,
end;
c:=3;
end;
最後是of 運算元的例子,如
text是內容是什麼,則傳入什麼,所以是算式也好,變數也好,寫入什麼就把悉數都傳入宏中翻譯凡是是零丁使用。
vardef ab[](expr p) = p shifted (#@翻譯社 b) enddef;
vardef (macroname) ... = ... enddef;其內容類似於
x:=1; show x;
x:=2;
群組與區域變數(Grouping and Local Variables)
變數suffix是文字的部門,則利用
def upto = step 1 until enddef;
vardef是和def很像,通常猶如def的寫法,如
f(x); show x;
一元運算元的例子:
show f x +3;
變數為a[]b的例子中,#@的意思是[]前面的所有的東西,包羅[]在內,而@則默示[]之後的器材,本例中就是b了。[]如果在最後方,如a.b[]翻譯社 則#@是[]前方所有的工具a.b,不包孕[],而@則是[]的部分。如果是a.b[4],那麼@的意思為[4]而不是4。@+1是不正當的翻譯
所以宏的界說,就是:
def 宏名稱 = 替代詞;回傳詞 enddef;
g(x); show x;
兩者成績分歧,f x +3 結果是 10, 而g x +3 是 7。原因在MetaPost解析文件時,其運算元的前後挨次是後atom, primary翻譯社 secondary, tertiary, expression的層級進行,在f中,它是屬於expression級的運算元,而+是 secondary級的運算元。所以 f x +3,x+3先做運算,然後才算f 5,而獲得10的結果;而g是 primary的運算元,所以它先算g x,然後才算 4+3而得到7。
show g x +3;
(a.b,4)
def 宏名稱 = 替代的文句 enddef;
所以 for i=1 upto 10: 就等於是 for i=1 step 1 until 10:
其中 f(x)就會呈現毛病,因為1:=2;不行能成立。
end;
執行了局是
宏本身也能夠傳值,而值的種類,有expr, text翻譯社 suffix三種,例如
hide的內容是一個判定式(exitif),就是檢查t是否為數值,由於它是以text體例傳入,幾近不行能成立,判斷式運算結果必為否,所程式不會間斷翻譯但它的內容不影響其他的程式碼,而對全域變數做了運算使其改變翻譯這用在程式中,用來計較不能直接賦值的變數型態如pair很有效。如本例是一種繪圖玩具,用二種圓所構成,小圓在大圓內圈轉動,小圓上的某一點所形成的軌跡翻譯path內的各點用--貫穿連接中間不克不及有終止(;),所以利用hide來運算全域變數,而不影響path的運算。
univector 是傳回長度為1的pair值:
def (macroname)... = begingroup ... endgroup enddef;
a.b4();
shifted -z rotated d shifted z
MetaPost是由「宏」所組成的說話,它的許多內容,都是由各種「宏」構成的。例如upto就是一個宏,它的內容是:
a:=1; b:=2;
vardef univector primary z = z/abs z enddef;
但它主要是以變數名稱為主的宏,變數名稱組成是:
a3b();
enddef;
begingroup
二元運算元,則由primarydef, secondarydef, tertiarydef來界說其運算層級,這裡沒有 def 或 vardef的版本翻譯如二向量的點積:
variable 由tag和suffix構成;
vardef a.b[](text t)= show (#@翻譯社@); enddef;
一元運算元
subscript 由 number or [numeric expression] 構成
有些詞的翻譯就比較精準,如copy 翻為「拷貝」,其實「拷備」可能更精準一點,但「貝」「備」同音,為了和原音接近,也還可以接管。當然,「複制」是最準確的。
show (a,b,c);
a:=4; b:=a+1;
show f(x); show f x; show g(x); show g x;
vardef direction expr t of p = postcontrol t of p - precontrol t of p enddef;
def 機車 = 討人厭 enddef; 後面的程式碼就會把所有機車的詞都替換成討人厭的詞。
rotatedaround(p+q翻譯社 a+b); 就會變成
end;
def g primary t = t*2 endfor;
def hide(text t)=exitif numeric begingroup t; endgroup; enddef;
這個例子可以看出expr和suffix的不同:
成績會是(4,5,3)和(1翻譯社5,3)。a在群組中利用save,等於是在群組中宣告了a變數,所以群組裡面的a值是4,在群組外的a值仍是1。b, c二變數在群組中被改變,它們是全域變數,所以在群組外面也遭到改變。
Macros 翻譯中文是什麼,查字典就是「宏」翻譯有的書也寫為「巨集」。這兩者如同含意搭不起來,至少華頓翻譯公司沒法從中文的意義和Macro的意義聯接不上。照Marco的字義來看,是「大」的意思,所以「宏」和「大」的意義相關,但在程式設計上,也不是這個意義。而「巨集」本身在中文辭彙中正本就沒成心義,也很難理解為什麼是用這個詞,「巨」和「大」相幹,但「集」呢?我想是如果能看到其真正編譯時的程式碼,可能是數萬行的程式碼,緣由是所看到定義的Marco其實不是單數,而是Marco"s", 一個看起來簡單的定義,背後必包括先前的定義,像是洋䓤一樣,用一層一層的定義包括起來。由這個概念來看,「龐大的糾合」的「巨集」就有了道理了翻譯
suffix可以empty or suffix subscript or suffix tag 構成
direction of 的界說是:
def f expr t = t =t*2 endfor;
vardef z@# = (x@#, y@#) enddef;
def f(expr t) = t +1 enddef;
MetaPost 的 宏和運算元都可以從新定義,消除本來的寄義,供應給使用者很大的彈性。
save a;
此中替代詞的的z會被p+q取代,而d被a+b庖代翻譯
def g(suffix a)=a:=3;