談判口譯

此中,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是文字的部門,則利用@#來表示其suffix的部分,如MetaPost中,z的界說:

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;