粤语編程語言.The Cantonese programming language.

Read this in other languages: English
粵語編程語言
想快速入門,請睇5分鐘學識粵語編程.個 Compiler 大部份係喺我高中时期開發嘅,so the code like a shit(宜家都一樣),歡迎各個粵語或編程愛好者一齊討論同貢獻!
點樣安裝?
pip install Cantonese
目錄
引言 咋咋淋臨入門 Hello World 賦值語句 睇下變量嘅類型 循環 條件語句 函數 掟出異常 斷言語句 錯誤捕捉語句 調用庫 面向對象編程 棧嘅使用 袋仔的法寶: 用Macro定义自己嘅语法
更多例子
睇下時間
暫停
嚟個隨機數
計相關係數
仲可以機械學習?
海龜畫圖
迷宮遊戲仔
各種排序同查找算法
寫個網頁嚟睇下?
用粵語開發一隻 App
數據庫編程都得???(開發緊)
點樣運行?
TODOs
引言
粵語編程語言係乜? 佢係一門用粵語嚟同計算機溝通嘅編程語言。 喺呢隻语言度,計算機可以讀明你寫嘅粵語。所以話,你可以用粵語嚟操作或虐待計算機。所有關鍵字可以使用繁體, 或者簡體同繁體混合
咋咋臨入門
Hello World
用粵語寫嘅第一個程序 Hello World:畀我睇下 "Hello World!" 點樣先?
賦值語句
介紹返「A」係 1
介紹返「B」係 2
或者:
介紹返 =>
「A」係 1
「B」係 2
先啦
可以用冇鳩用或者冇撚用嚟delete變量:
冇鳩用 A,B
睇下變量嘅類型
介紹返「A」係 1
起底「A」
運行結果:
<class 'int'>
循環
打印從 1 到 100, 其中飲茶先啦相當於break, Hea陣先相當於Continue:
介紹返 =>
「start」係 0
「结束」係 唔啱
先啦
落操场玩跑步
介紹返「start」係「start」+ 1
畀我睇下「start」 點樣先??
如果 |start >= 100| 嘅话 => {
飲茶先啦
}
Hea陣先
玩到「结束」为止
收工
當然用 For 循環都得:
「A」从 1 行到 100
畀我睇下「A」點樣先??
到步
條件語句
介紹返「A」係 2
如果 |A 係 2| 嘅话 => {
畀我睇下 "A 係 2" 點樣先??
}
唔係 嘅话 => {
畀我睇下"A 唔係 2" 點樣先??
}
仲可以用match
介紹返 状态 係 404
睇撚住 状态 =>
| 撞见 400 => { 畀我睇下 "Bad request" 點樣先?? }
| 撞见 401 => { 畀我睇下 "Unauthorized" 點樣先?? }
| 撞见 403 => { 畀我睇下 "Forbidden" 點樣先?? }
| 撞见 404 => { 畀我睇下 "Not found" 點樣先?? }
| 撞见 418 => { 畀我睇下 "I'm a teapot" 點樣先?? }
| _ => { 畀我睇下 "乜都唔係" 點樣先?? }
搞掂
函数
返回最大值:介紹返 $get_max 计下 |数字1, 数字2| 點部署
如果 |数字1 比唔上 数字2| 嘅话 => {
还数「数字2」
}
唔係 嘅话 => {
还数「数字1」
}
搞掂
調用函數:
介紹返 結果 係 get_max 计下 (23, 17)
畀我睇下 結果 點樣先??
函數式编程:
畀我睇下
|就咁 x, y { x + y } (2, 2)|
點樣先??
運行結果:
4
掟出異常
掟个「ImportError」嚟睇下?
運行結果:
濑嘢!!!: ImportError:
喺runtime察覺到錯誤!
--> ../examples/basic/raise.cantonese 4:0
| 掟个 |ImportError| 嚟睇下?
^^^^^^^^^^^^^^^^^^^^^^^^^^ Tips: 幫緊你只不過有心無力:(
:D 不如跟住我嘅tips繼續符碌下?
斷言語句
諗下「1 + 1 == 3」? 運行結果: 濑嘢!!!: AssertionError: 喺runtime察覺到錯誤! --> ../examples/basic/assert.cantonese 6:0 | 諗下 |1 - 1 == 1| ? ^^^^^^^^^^^^^^^^^^^^ Tips: 幫緊你只不過有心無力:(
:D 不如跟住我嘅tips繼續符碌下?
錯誤捕捉語句
try-except-finally:执嘢 => { 介紹返 |A| 係 |B| } 揾到「NameError」嘅话 => { 畀我睇下 "揾到NameError" 點樣先? } 执手尾 => { 畀我睇下 "执手尾" 點樣先? 介紹返 |A| 係 1 介紹返 |B| 係 1 畀我睇下 |A, B| 點樣先? } 調用庫
調用 Python 庫:使下 py::os::* 使下 py::math::* 使下 py::{re::*, pandas} 調用 Python 代碼: 我係二五仔 #XD def add(a, b): return a + b 二五仔係我
畀我睇下 |add 下 (8, 2)| 點樣先 / 輸出10 /
又或者使用Macro調用Python和Rust: {% std::macros::{Py, Rust} %}
Py!( def add(a, b): return a + b ) 畀我睇下 |add 下 -> (8, 2)| 點樣先
介紹返 add 係 Rust!( fn add(a: i32, b: i32) -> i32 { a + b } ) 畀我睇下 |add 下 -> (8, 2)| 點樣先
面向對象編程
聲明對象duck,繼承至 object,分別有兩個方法 游水 同埋 睡觉 ,仲有一個屬性 性别: 介紹返 duck 係 乜X { 佢個老豆叫 object 佢有啲咩?? => 性别: 公家嘢, 年龄: 私家嘢 佢識得 游下水 |自己| => { 畀我睇下 "Duck is swimming" 點樣先?? } 佢識得 睡下觉 |自己| => { 畀我睇下 "Duck is sleeping" 點樣先?? } } 創建object: 介紹返 myduck 係 阿->duck(性别="公") 調用對象中嘅方法: 好心 myduck -> 游下水 啦! 好心 myduck -> 睡下觉 啦! 運行結果: Duck is swimming Duck is sleeping
棧嘅使用
首先創建一個Stack:有條仆街叫 |Deo哥|
或者用返賦值嘅方式:
介紹返 Deo哥 係 條仆街仔()
進行操作:
顶你 => |Deo哥| 1
顶你 => |Deo哥| 2
顶你 => |Deo哥| 3
丢你 => |Deo哥|
運行結果:
Stack: [1,2]
袋仔的法寶: 用Macro定义自己嘅语法
介紹咗咁多, Cantonese仲將類似於Rust入面嘅宏定義引入, 可以通過宏來擴展我哋嘅語法, 簡單啲講, 就相當於match語句, 匹配之後用@提取元變量喺編譯期間進行替換:
介紹返 sayhello 係 袋仔的法寶 =>
| (Hello @s: str) => { 畀我睇下 "Hello " + @s 點樣先?? }
| () => { 畀我睇下 "Hello" 點樣先?? }
搞掂
sayhello!(Hello "dd") sayhello!() sayhello!(1) # 報錯: 無法匹配
介紹返 vec 係 袋仔的法寶 => | ($(@element:expr),*) => { [$(@element)*] } | () => { [] } 搞掂
畀我睇下 vec!("Hello", 1+1, "gg",) 點樣先?? # ['Hello', 2, 'gg'] 畀我睇下 vec!() 點樣先?? # []
複雜啲嘅例子, 定义新嘅语法:同我计 XX 乜 XX 好唔好: 介紹返 計算 係 袋仔的法寶 => | (同我計 @左: lit 加 @右: lit 好唔好) => { @左 + @右 } | (同我計 @左: lit 减 @右: lit 好唔好) => { @左 - @右 } | (同我計 @左: lit 除 @右: lit 好唔好) => { @左 / @右 } | (同我計 @左: lit 乘 @右: lit 好唔好) => { @左 * @右 } 搞掂
畀我睇下 計算!(同我計 1 加 2 好唔好) 點樣先?? # 3
畀我睇下 計算!(同我計 2 乘 2 好唔好) 點樣先?? # 4
標準庫嘅macro定義喺晒依度
更多例子
顯示當前時間
使下 std::日期
畀我睇下 |宜家几点()| 點樣先?
運行結果:
2021-01-17 09:16:20.767191
暫停
使下 std::time::瞓
瞓 -> 阵先 啦 / 暂停2s / 瞓 -> "5s" 啦/ 暂停5s /
嚟個隨機數
使下 std::随机数 介紹返 |A| 係 |求其啦()| 運行結果: 0.15008236307867207 計相關係數
聲明兩個 list,計相關係數:{% std::macros::math %} 使下 py::math
|[2.165, 1.688, 1.651, 2.229]| 拍住上 => |A| |[2.060, 1.822, 1.834, 2.799]| 拍住上 => |B| 畀我睇下 秘诀!(A 同 B 有幾襯) 點樣先?
運行結果: 0.8066499427138474 仲可以机器学习?
首先要搞清楚樣嘢, 喺源代碼can_libs/macros/math.cantonese入面, 其實定義咗一個macro, 負責簡單地替換函數調用同埋輸出結果: 介紹返 过嚟估下 係 袋仔的法寶 => | (@model: id => $(@args: expr),*) => { 畀我睇下 @model(${@args},*) 點樣先?? } | () => { None } 搞掂 前面講過macro只係簡單地包裝咗一層語法, 咁我哋可以用过嚟估下宏定義去調用底層嘅算法函數喇! 實現 KNN 算法: {% std::macros::math %}
使下 py::math
|[[5, 1], [4, 0], [1, 3], [0, 4]]| 拍住上 => |数据| |['动作片', '动作片', '科幻片', '科幻片']| 拍住上 => |标签| 介紹返 |K| 係 3 过嚟估下!(KNN => |[3, 0]|, 数据, 标签, K)
運行結果: 动作片 線性回歸: {% std::macros::math %}
使下 py::math
|[300.0 , 400.0 , 400.0 , 550.0 , 720.0 , 850.0 , 900.0 , 950.0]| 拍住上 => |X| |[300.0 , 350.0 , 490.0 , 500.0 , 600.0 , 610.0 , 700.0 , 660.0]| 拍住上 => |Y| 过嚟估下!(L_REG => |900.0|, X, Y,)
運行結果: Linear function is: y=0.530960991635149x+189.75347155122432 667.6183640228585 海龜繪圖
{% std::macros::ui %}
使下 py::turtle
老作一下!( 首先 |画个圈(100)|, 跟住 |写隻字("Made By Cantonese\n", False,'center')|, 最尾 |听我支笛()|, )
運行結果:
迷宮遊戲仔
代碼 運行結果:
各種排序同查找算法
寫個網頁睇下
一個簡單嘅網頁:{% std::macros::net %}
使下 std::net::监视;
介紹返 html 係 HTML老作一下! ( 打标题 => [ "我嘅第一个网页" ] 拎笔 => [ "Hello World" ] )
监视 下 -> |html, "127.0.0.1", 80| 啦
運行後,打開 127.0.0.1:80 就可以睇到運行結果:
用粵語開發一隻 App
首先安裝kivy:
pip install kivy
第一隻 App HelloWord:
使下 py::kivy
介紹返 HelloApp 係 乜X { 佢個老豆叫 App 佢識得 HelloWorld |自己| => { 介紹返 做嘢 係 同我show 下 "Hello World" 还数 做嘢 } }
App运行 下 -> |HelloApp, HelloApp()->HelloWorld| 啦
數據庫編程都得(開發緊)
select語句:使下 macros::sql::*;
SQL!{ 喺 成績表 度揾 學生哥 邊個 (年紀 大于 10 同埋 名字 係 'dany');
喺 成績表 度揾 最尾 10 个 學生哥; 喺 成績表 度揾 排頭 20 个 學生哥; } / select from xx */ SQL{ 睇下 xx; }
仲有啲咩?
喺呢度睇下更多例子. 所有關鍵字: https://github.com/Cantonese-community/Keywords
点样运行?
查看當前版本:cantonese -v
如果發覺輸出怪怪地, 咁啱又喺 windows, 咁請先用管理員身份運行指令嚟支援ANSI颜色顯示:
reg add HKCU\Console /v VirtualTerminalLevel /t REG_DWORD /d 1
Cantonese 可以用多種方式運行,用 LLVM,或者翻譯成 Python 同 HTML 都得!
使用LLVM執行 (需安装llvmlite同clang, 僅支援部分語句):
cantonese [-文件名] -llvm
用 Python 虛擬機運行(環境净係支援 Python3,因为噉先至符合廣東人先進嘅思想!):
cantonese [-文件名]
將 Cantonese 轉化成 Python:
cantonese [文件名] -to_py
例如:
cantonese examples/basic/helloworld.cantonese -to_py
運行嘅結果係:
print(" Hello World! ")
exit()
生成 HTML:
cantonese examples/web/webhello.cantonese -toweb -compile
<html>
<head>
<meta charset="utf-8" />
</head>
<title>我嘅第一个网页</title>
<h1>Hello World</h1>
</html>
Vscode插件:https://github.com/Cantonese-community/vscode-cantonese
TODOs
歡迎各個粵語同埋編程愛好者一齊討論同貢獻!為粵語文化遺產嘅保護貢獻出自己嘅一份力量! send PR 前請睇 貢獻指南今後要做咩:
- 用D设计模式重构下
- 完善自己嘅虛擬機
- 完全支持
LLVM同JIT