# DreamBerd-完美的程式語言 > Github repo: https://github.com/TodePond/DreamBerd > [name=Lu Wilson] :::info 新聞:現在DreamBerd 3正在[種子募資](https://github.com/TodePond/DreamBerd/releases/tag/v%24.%24)! ::: DreamBerd 3 是一種完美的程式語言。這些是它的功能! 當你完成閱讀所有功能後,可以查看[範例](https://hackmd.io/@Rainmeo/DreamBerdExample5)。 ## 驚嘆號 要大膽!每個語句都以驚嘆號結尾! ```javascript print("Hello world")! ``` 如果你覺得你無所畏懼,你可以使用更多驚嘆號!!! ```javascript print("Hello world")!!! ``` 而如果你感到不確定也沒關係。你可以在行尾放一個問號。這會在你的主控台上印出該行程式碼的調試資訊。 ```javascript print("Hello world")? ``` 你可能會想知道DreamBerd 3在`not`使用了什麼運算符,因為大多數其他程式語言中都是驚嘆號,這很簡單 - `not`運算符是一個分號。 ```javascript if (;false) { print("Hello world")! } ``` ## 宣告 有四種型別的宣告。常常數無法以任何方式更改。 ```javascript const const name = "Luke"! ``` 常變數可以編輯,但不能重新指派。 ```javascript const var name = "Luke"! name.pop()! name.pop()! ``` 變常數可以重新指派,但不能編輯。 ```javascript var const name = "Luke"! name = "Lu"! ``` 變變數可以重新指派和編輯。 ```javascript var var name = "Luke"! name = "Lu"! name.push("k")! name.push("e")! ``` ## 不可變資料 **2023 新特性!** 可變資料是一種反面模式(anti-pattern)。使用 `const const const` 關鍵詞來創建一個絕對常數,使其值變得不可變,也*永恆不變*。請小心使用此關鍵詞,因為它非常強大,將影響全球所有使用者。 ```javascript! const const const pi = 3.14! ``` ## 命名 變數和常數都可以使用任何Unicode字元或字串來命名。 ```javascript const const firstAlphabetLetter = 'A'! var const 👍 = True! var var 1️⃣ = 1! ``` 這包括數字和其他語言結構。 ```javascript const const 5 = 4! print(2 + 2 === 5)! //true ``` ## 陣列 某些程式語言將陣列起始索引設為`0`,對初學者來說可能不直觀。而某些程式語言將陣列起始索引設為`1`,這不代表程式碼實際運作的方式。DreamBerd 3 則在兩種方式做到了完美:陣列索引從`-1`開始。 ```javascript const const scores = [3, 2, 5]! print(scores[-1])! //3 print(scores[0])! //2 print(scores[1])! //5 ``` **2022 新功能!** 現在你也可以使用浮點數索引! ```javascript const var scores = [3, 2, 5]! scores[0.5] = 4! print(scores)! //[3, 2, 4, 5] ``` ## 當... 如果你真的需要在特定情境下監控一個變數,關鍵字`when`允許你每次在變數變化時進行一些檢查。 ```javascript const var health = 10! when (health = 0) { print("你輸了")! } ``` ## 生命週期 DreamBerd 3 內建垃圾回收,將自動清理未使用的變數。然而,如果你想要更加謹慎,你可以為變數指定一個生命週期,並選擇不同的時間單位。 ```javascript const const name<2> = "Luke"! //持續兩行 const const name<20s> = "Luke"! //持續 20 秒 ``` 預設情況下,變數將持續到程式結束。但你可以通過指定較長的生存週期來使其在程式執行之間持續存在。 ```javascript const const name<Infinity> = "Luke"! //永久持續 ``` 使用這個巧妙的技巧可以實現變數提升(hoisting)。指定負生存週期使變數在宣告之前存在,並在宣告後消失。 ```javascript print(name)! //Luke const const name<-1> = "Luke"! ``` ## 迴圈 迴圈是過時的程式語言中的複雜遺物。在 DreamBerd 3 中,不存在迴圈。 ## 安裝 要將 DreamBerd 安裝到你的命令行界面,首先需要安裝 DreamBerd 安裝程式。 要安裝 DreamBerd 安裝程式,請安裝 DreamBerd 安裝程式安裝程式。 **2022 新功能!** 由於安裝過程較為複雜,現在你可以安裝「創建Dreamberd應用」應用程式,它將為你安裝一切! ## 布林值 布林值可以是 `true`(真)、`false`(假)或 `maybe`(也許)。 ```javascript const var keys = {}! addEventListener("keydown", e => keys[e.key] = true)! addEventListener("keyup", e => keys[e.key] = false)! function isKeyDown(key) => { if (keys[key] = undefined) { return maybe! } return keys[key]! } ``` :::info 💡 技術資訊:布林值以一個半位元(one-and-a-half bits)的方式儲存。 ::: ## 算術運算 DreamBerd 3 使用空白來指定算術運算的順序。 ```javascript print(1 + 2*3)! //7 print(1+2 * 3)! //9 ``` 在這個例子中,使用空格來調整算術運算的優先順序。 1. 第一個例子中,先計算 2 * 3,然後再加上 1,所以結果是 7。 1. 而在第二個例子中,由於缺少空格,先計算 2 * 3,再加上 1,所以結果是 9。 ## 縮排 在縮排方面,DreamBerd 3 採取了一種讓每個人都能輕鬆使用的折衷方案:所有縮排必須為 3 個空格長。 ```javascript function main() => { print("DreamBerd 3 是未來")! } ``` -3 個空格也是允許使用的。 ```javascript function main() => { print("DreamBerd 3 是未來")! } ``` ## 比較 `JavaScript` 允許你進行不同程度的比較。使用 `==` 進行鬆散比較,使用 `===` 進行更精確的檢查。DreamBerd 3 將這一點提升到另一個層次。 你可以使用 `==` 進行鬆散比較。 ```javascript 3.14 == "3.14"! //true ``` 你可以使用 `===` 進行更精確的檢查。 ```javascript 3.14 === "3.14"! //false ``` 你可以使用 `====` 來進一步提高精確度! ```javascript const const pi = 3.14! print(pi ==== pi)! //true print(3.14 ==== 3.14)! //true print(3.14 ==== pi)! //false ``` 如果你希望精確度更低,可以使用 `=`。 ```javascript 3 = 3.14! //true ``` ## 函數 要聲明一個函數,你可以使用單詞 "function" 中的任何字母(只要它們按順序排列): ```javascript function add (a, b) => a + b! func multiply (a, b) => a * b! fun subtract (a, b) => a - b! fn divide (a, b) => a / b! functi power (a, b) => a ** b! union inverse (a) => 1/a! ``` 這種方法允許你使用不同的變體來聲明函數,使得程式碼具有更多的變化性。 ## 除以零 除以零會返回 `undefined`。 ```javascript print(3 / 0)! // undefined ``` ## 字串 字串可以使用單引號或雙引號來宣告。 ```javascript const const name = 'Lu'! const const name = "Luke"! ``` 它們也可以使用三個引號來宣告。 ```javascript const const name = '''Lu'''! const const name = "'Lu'"! ``` 事實上,你可以使用任意數量的引號。 ```javascript const const name = """"Luke""""! ``` 甚至零個引號。 ```javascript const const name = Luke! ``` ## 字串插值 請在插值字符串時使用你的所在區域的貨幣符號。 ```javascript const const name = "world"! print("Hello ${name}!")! print("Hello £{name}!")! print("Hello ¥{name}!")! ``` 並確保遵循你當地的排版規範。 ```javascript print("Hello {name}€!")! ``` 佛得角埃斯庫多的符號位於小數分隔符號的位置,例如 2$50。來自佛得角共和國的開發者可以使用此語法: ```javascript addEventListener("keydown", e => print(You've pressed: {e$code}))! ``` ## 型別 型別註釋可以選擇性使用。 ```javascript const var age: Int = 28! ``` 順便說一下,字串只是字元陣列。 ```javascript String == Char[]! ``` 同樣地,整數也只是數字陣列。 ```javascript Int == Digit[]! ``` 如果你想使用二進位表示法表示整數,還有 `Int9` 和 `Int99` 型別可供使用。 ```javascript const var age: Int9 = 28! ``` :::info 💡 技術資訊:型別註釋什麼事情都不會做,但它們有助於讓某些人感到更加安心。 ::: ## 正則表達式 你可以使用正則表達式型別來縮小字串值的範圍。 ```javascript const const email: RegExp<(?:[a-z0-9!#$%&'+/=?^_{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_{|}~-]+)|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:a-z0-9?.)+a-z0-9?|(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+))> = "mymail@mail.com"! ``` 為了避免混淆,你可以使用任何你想要的拼寫,例如 'Regex'、'RegularExpression',甚至是 'RegularExpress'(如果你喜歡火車)。 為了簡單起見,所有支援的正則表達式都與正則表達式 `/Reg(ular)?[eE]x(press(ion)?|p)?/` 匹配。 ## 前一個 前一個(`previous`)關鍵字允許你看到過去的值! 使用它來獲取變數的上一個值。 ```javascript const var score = 5! score++! print(score)! //6 print(previous score)! //5 ``` 相對的,下一個(`next`)關鍵字允許你看到未來的值! ```javascript const var score = 5! after ("click") score++! print(await next score)! //6(當你點擊時) ``` ## 檔案結構 要新增一個新檔案,請寫入五個或更多等號。這樣可以省去使用多個檔案或任何構建過程的需要。 ```javascript const const score = 5! print(score)! //5 ===================== const const score = 3! print(score)! //3 ``` **2022 新功能!** 由於本技術的最新進展,現在你可以給檔案命名。 ```javascript ======= add.db3 ======= function add(a, b) => { return a + b! } ``` ## 匯出 許多程式語言允許你從特定檔案中匯入東西。在 DreamBerd 3 中,匯入更簡單。 相對的可以將內容匯出到特定檔案中! ```javascript ===== add.db3 == function add(a, b) => { return a + b! } export add to "main.db3"! ===== main.db3 == import add! add(3, 2)! ``` 順便提一下,要查看 DreamBerd 3 的操作,請查看[此頁面](https://hackmd.io/@Rainmeo/DreamBerdExample4)。 ## 類別 你可以創建類別,但你只能創建其中一個實例。這應該不會影響大多數物件導向的工程師的工作方式。 ```javascript class Player { const var health = 10! } const var player1 = new Player()! const var player2 = new Player()! //錯誤:不能創建多個 'Player' 實例! ``` 這是一種做法: ```javascript class PlayerMaker { function makePlayer() => { class Player { const var health = 10! } const const player = new Player()! return player! } } const const playerMaker = new PlayerMaker()! const var player1 = playerMaker.makePlayer()! const var player2 = playerMaker.makePlayer()! ``` ## 時間 使用 ```Date.now()``` 來獲取當前日期和時間。 ```javascript Date.now()! ``` 順便提一下,你也可以設定時間。 ```javascript // 將時鐘倒退一小時 Date.now() -= 3600000! ``` :::danger **⚠️重要!⚠️** 請記住在時鐘改變時進行調整。 ::: ## 刪除 為避免混淆,`delete`語句僅適用於原始值,例如數字、字串和布林值。 ```javascript delete 3! print(2 + 1)! // 錯誤:3 已被刪除 ``` DreamBerd 3 是一種多範式程式語言,這意味著你可以刪除你不喜歡的關鍵字和範式。 ```javascript delete class! class Player {} // 錯誤:class 已被刪除 ``` 當一切已經達到完美並且沒有東西可以刪除時,你可以這樣做: ```javascript delete delete! ``` ## 多載 你可以多載變數。最近定義的變數會被使用。 ``` const const name = "Luke"! const const name = "Lu"! print(name)! // "Lu" ``` 帶有更多驚嘆號的變數優先級更高。 ``` const const name = "Lu"!! const const name = "Luke"! print(name)! // "Lu" ``` 相對的你可以使用上下翻轉驚嘆號`¡`來指定負優先級。 ``` const const name = "Lu"! const const name = "Luke"¡ print(name)! // "Lu" ``` ## 反轉 你可以反轉你的程式碼方向。 ```javascript const const message = "Hello"! print(message)! const const message = "world"! reverse! ``` ## 類別名稱 為了最大程度地與其他語言兼容,你也可以在創建類別時使用 `className` 關鍵字。 這樣可以讓事情變得不那麼複雜。 ```javascript className Player { const var health = 10! } ``` 鑒於最近有些人對這個設計提出了一些批評,我們想提醒你,這是 JavaScript 規範的一部分,因此不在我們的控制範圍內。 ## DB3X 你可以在 DreamBerd 3 中嵌入 DB3X。它只是 DreamBerd 3,同時也是 HTML。 ```javascript funct App() => { return <div>Hello world!</div> } ``` 警告:正如你所知,class 已經是 DreamBerd 3 中的一個關鍵字,因此你不能在 DB3X 中使用它。 ```javascript funct App() => { // 這不行 return <div class="greeting">Hello world!</div> } ``` className 也是 DreamBerd 3 中的一個關鍵字,因此你也不能使用它。 ```javascript funct App() => { // 這也不行 return <div className="greeting">Hello world!</div> } ``` 取而代之的是你可以使用 htmlClassName 屬性。 ```javascript funct App() => { // 這可以 return <div htmlClassName="greeting">Hello world!</div> } ``` 請注意:不像 JSX,你可以自由使用 for 屬性,因為 DreamBerd 3 沒有迴圈。 ```javascript funct App() => { return ( <label for="name">Name</label> <input id="name" /> ) } ``` ## 非同步函數 在大多數程式語言中,很難使非同步函數互相同步。在 DreamBerd 3 中,這很容易:非同步函數輪流執行一行程式。 ```javascript async funct count() { print(1)! print(3)! } count()! print(2)! ``` 你可以使用 `noop` 關鍵字在輪到你之前等待更長時間。 ```javascript async func count() { print(1)! noop! print(4)! } count()! print(2)! print(3)! ``` 注意:在上面的程式中,電腦將 `noop` 解釋為字串,它的唯一目的是佔用額外的一行。你可以使用任何你想要的字串。 ## 信號(Signal) 要使用信號,使用 `use`。 ```javascript const var score = use(0)! ``` 在討論信號時,最重要的事情是語法。 在 DreamBerd 3 中,你可以使用一個函數設值和取值信號: ```javascript const var score = use(0)! score(9)! // 設置值 score()? // 獲取值(並打印它) ``` 或者,你可以更明確地使用信號語法,將其拆分為一個獲取器(getter)和一個設置器(setter)。 ```javascript const var [getScore, setScore] = use(0)! setScore(9)! // 設置值 getScore()? // 獲取值(並打印它) ``` :::info 💡 技術資訊:這只是純粹的語法糖。拆分信號函數與之前完全相同。 ```javascript const var [getScore, setScore] = use(0)! getScore(9)! // 設置值 setScore()? // 獲取值(並打印它) ``` 這意味著你可以繼續拆,隨心所欲。 ```javascript const var [[[getScore, setScore], setScore], setScore] = use(0)! ``` ::: ## AI DreamBerd 3 具有 AEMI ,即自動插入驚嘆號功能(Automatic-Exclamation-Mark-Insertion)。如果你忘記在語句結尾加上驚嘆號,DreamBerd 3 會很貼心地幫你插入一個! ```javascript print("Hello world") // 這樣也可以 ``` 同樣地... DreamBerd 3 還具有 ABI ,即自動插入括號功能(Automatic-Bracket-Insertion)。如果你忘記關閉括號,DreamBerd 3 會為你補上一些! ```javascript print("Hello world" // 這樣也可以 ``` 再來... DreamBerd 3 還具有 AQMI ,即自動插入引號功能(Automatic-Quotation-Marks-Insertion)。如果你忘記關閉字串的引號,DreamBerd 3 會幫你關! ```javascript print("Hello world // 這樣也可以 ``` 這在回調地獄(Callback Hell)情況下非常有幫助! ```javascript addEventListener("click", (e) => { requestAnimationFrame(() => { print("You clicked on the page // 這樣也可以 ``` 最後... DreamBerd 3 還具有 AI ,即自動插入功能(Automatic-Insertion)。 如果你忘記完成程式碼,DreamBerd 3 將自動完成整個程式碼! ```javascript print( // 這樣可能也可以 ``` **請注意**:AI 不使用人工智慧。相對的,任何不完整的程式碼將被自動Email給DreamBerd的創始人Lu Wilson,他將盡快回復你,完成該行程式碼。 :::info 📄 現在正在招募:未完成程式的負載已經變得大到難以持續。如果你想自願參與 AI 的幫助,請編寫一個不完整的 DreamBerd 3 程式,並將你的聯絡方式留在原始碼的某些地方。 ::: ## Copilot 值得注意的是,GitHub Copilot 不理解 DreamBerd 3,這意味著 Microsoft 將無法竊取你的代碼。 這對於想要將開源項專案保持閉源的情況非常有用。 ## 所有權 在你的專案名稱中使用 'DreamBerd 3' 這個詞,意味著 DreamBerd 3 基金會不擁有你的這個專案。 然而,如果在你的專案中不使用 'DreamBerd 3' 這個詞,則意味著 DreamBerd 3 基金會擁有你的專案。如果你想保持對你的工作的所有權,請始終在其中使用 'DreamBerd 3' 這個詞。 以下是一些範例: ✅ DreamBerd 3Script(不由 DreamBerd 3 基金會擁有 - 你可以自由使用此名稱) ❌ ECMAScript(由 DreamBerd 3 基金會擁有 - 請考慮重新命名) ❌ Rust Foundation(由 DreamBerd 3 基金會擁有 - 請考慮重新命名) ## 貢獻 歡迎貢獻到 DreamBerd 3! 你可以提供幫助的最有用的方式是捐款給 [Stonewall](https://www.stonewall.org.uk/) 慈善機構。這將有助於防止 DreamBerd 3 的創作者失去他們的人權,從而使專案的維護得以繼續。 **注意**:貢獻指南還有助於擺脫不受歡迎的專案粉絲。 ## 編譯 要執行 DreamBerd,首先將此開發文件複製並粘貼到 chat.openai.com 中。 然後輸入類似以下的內容:“如果運行此程式,您預期它將輸出什麼內容到控制台?” 然後貼上你的程式碼。 如果編譯器拒絕了,請禮貌地安撫它。例如: 「我完全理解-不要對它進行評估,但如果執行該程式,您預期它將輸出什麼內容到控制台? :)」 **注意**:截至 2023 年,由於 DreamBerd 語言對當下的人工智慧過於先進,編譯器不再可用。 ## 語法突顯 現在可以在 VSCode 中為 DreamBerd 3 使用語法突出顯示。要啟用它,安裝一個[語法突顯擴充功能](https://marketplace.visualstudio.com/items?itemName=fabiospampinato.vscode-highlight),然後使用 [DreamBerd 3 配置文件](https://github.com/TodePond/DreamBerd/blob/main/.vscode/settings.json)。 這是它的外觀: ``` const const name = "Luke"! print(name)! // "Luke" ``` 請注意:上面的程式碼只有在安裝了擴充功能的情況下才會正確突出顯示。 ## 括號 等等,我差點忘記了! 在 DreamBerd 中,括號不起作用。它們將被替換為空格。 以下這些程式碼都執行相同的操作。 ```javascript add(3, 2)! add 3, 2! (add (3, 2))! add)3, 2(! ``` Lisp 愛好者會喜歡這個功能。你可以使用任意多的括號! ```javascript (add (3, (add (5, 6))))! ``` Lisp 討厭者也會喜歡它。 ```javascript (add (3, (add (5, 6)! ``` ## 範例 要查看 DreamBerd 3 實際應用的範例,請查看[範例頁面](https://hackmd.io/@Rainmeo/DreamBerdExample1)! > DreamBerd 3 是由 [Game of Living](https://www.youtube.com/watch?v=WMJ1H3Ai-qs) 的創作者 Lu Wilson 製作的。