# 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 製作的。