OpenSCAD 使用者手冊/面向 C/Java/Python 程式設計師
OpenSCAD 是一種純函式式語言。這意味著與您可能習慣的程式設計風格不同。
本文件旨在幫助學習 OpenSCAD 的程式設計師(他們認為是)“正常”程式語言的程式設計師,避免過度沮喪。不要以為您是程式設計專家就可以跳過它。事實上,您對過程式或面嚮物件語言越熟悉,本文件對您越有幫助。
一種對程式語言進行分類的方法是區分命令式語言和宣告式語言。眾所周知的命令式語言包括 C、C++、C#、Java、Python、Ruby、PHP 和 JavaScript。這些語言也可以稱為過程式或面嚮物件語言。所有過程式和麵向物件語言都是命令式語言。
命令式程式由一系列改變程式狀態的操作組成。例如,語句
x = 5;
在大多數命令式語言中將 x 的值改變為 5。
x = square_root(x);
將 x 的值(從 5)改變為 5 的平方根。
命令式程式具有控制流 - 首先是這一行,然後是下一行,直到某些結構(例如 if、for、while 或函式呼叫)改變控制流。
另一方面,宣告式語言缺乏這些屬性。宣告式語言包括 HTML、正則表示式、電子表格、Prolog 和純函式式語言。宣告式語言不經歷狀態變化(html 程式碼只是存在 - HTML 中沒有賦值)。宣告式語言就像一個複雜而正式的描述。
宣告式語言的一種子型別是“純函式式”。這意味著用相同的引數呼叫同一個函式始終返回相同的結果。為了保證這一點,函式內不能進行全域性變數或輸出的讀寫。
OpenSCAD 是一種宣告式、純函式式語言。這對許多習慣於命令式語言的程式設計師來說是一個困惑的來源。他們試圖在 OpenSCAD 中做一些“簡單的事情”(比如 x = x + 1),但由於一些意想不到的原因,“它無法工作”,無論他們投入多少專業知識都無濟於事。為了避免過度沮喪,請閱讀本文件的其餘部分。
參見
- 程式更可預測,因此不易出錯
- 更容易推理程式,並證明它們是正確的
- 更容易並行化
- 由於高階語言和簡潔的語法,程式更短
- 特別是在 OpenSCAD 對布林運算的建模方式中,保證了布林 CSG 運算的數學屬性(如並集的交換性)
所以現在您知道 OpenSCAD 的設計之所以如此,是因為它具有一定的優勢。當您遇到看似過度嚴格的限制,阻止您進行任何操作時,請牢記這一點。
C 和 OpenSCAD 都使用 = 符號進行賦值。兩種語言在“賦值”的確切含義上有所不同。C 樣式的 = 稱為“破壞性更新運算子”,表示“將 .. 設定為”(如將 myvar 設定為 7)。該運算子稱為破壞性運算子,因為它會破壞之前儲存在變數中的值。它被稱為“更新”,因為它將變數的值從舊值更新為新值。
OpenSCAD 樣式的賦值表示“是”。它不是破壞性的 - 您無法用新值覆蓋舊值。沒有舊值和新值,如果 x 是 5,則 x 在整個範圍內都是 5,即使在定義它之前也是如此。這更接近於變數和等號的數學定義。
因此,在 OpenSCAD 中不允許重新賦值(破壞性更新)變數。並且沒有直接的替代方法。這意味著問題必須以完全不同的方式解決,使用以下技術
- 不同的變數名稱
- 函式和遞迴(使用三元運算子 ? : 代替 if)
- 列表推導和 concat() 函式
// C
cube(x); // undefined behavior - x not yet initialized
x = 4;
cube(x); // call a function to create cube of size 4
x = 5; // destructively update x to 5, in the process destroying the old value.
cube(x); // call a function to create cube of size 5
x++; // set x to x+1. The increment operators in C are also destructive update operators.
cube(x); // call a function to create cube of size 6
// OpenSCAD
y = x + 1; // y is 6
cube(x); // declare a cube of size 5
x = 5; // x is 5.
cube(x) // declare a cube of size 5
cube(y) // declare a cube of size 6
// The other lines are left out, because reassignment of variables are not permitted.
不幸的是,重新賦值目前不會給出錯誤訊息,因為它用於在命令列上指定覆蓋。
參見
- C 和其他命令式語言中使用的變數:w:變數(計算機科學)
- OpenSCAD 變數與以下方面更相似:w:變數(數學)
- 關於變數的普通章節:OpenSCAD 使用者手冊/一般#變數