# cantonese
**Repository Path**: heckel/cantonese
## Basic Information
- **Project Name**: cantonese
- **Description**: Cantonese 是一门用粤语来与计算机沟通的编程语言
- **Primary Language**: Python
- **License**: MIT
- **Default Branch**: main
- **Homepage**: https://www.oschina.net/p/cantonese
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 3
- **Created**: 2022-04-07
- **Last Updated**: 2022-04-07
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README

### Read this in other languages: [English](README-en.md)
[](https://pypi.org/project/Cantonese/)
[](https://pypi.org/project/Cantonese/)
# 粵語編程語言
如果你唔識粵語或者編程,請睇[5分钟边学编程边学粤语](doc/cantonese.md)
# 點樣安裝?
```
pip install Cantonese
```
# 目錄
引言
咋咋淋臨入門
Hello World
賦值語句
睇下變量嘅類型
循環
條件語句
函數
掟出異常
斷言語句
錯誤捕捉語句
調用 Python 庫
面向對象編程
棧嘅使用
更多例子
睇下時間
暫停
嚟個隨機數
計相關系數
仲可以機械學習?
海龜畫圖
迷宮遊戲仔
各種排序同查找算法
寫個網頁嚟睇下?
用粵語開發一隻 App
點樣運行?
TODOs
# 引言
粵語編程語言係乜嘢? 佢係一門用粵語嚟同計算機溝通嘅編程語言。
喺呢隻语言度,計算機可以讀明你寫嘅粵語。所以話,你可以用粵語嚟操作(虐待)計算機。
#### 所有關鍵字可以使用繁體, 或者簡體同繁體混合
# 咋咋臨入門
### Hello World
用粵語寫嘅第一個程序 Hello World:
```
畀我睇下 "Hello World!" 點樣先?
```
### 賦值語句
```
讲嘢 |A| 系 1
讲嘢 |B| 系 2
```
### 睇下變量嘅類型
```
讲嘢 |A| 系 1
起底: |A|
```
運行結果:
```
```
### 循環
打印從 1 到 100:
```
讲嘢: |start| 系 0
讲嘢: |结束| 系 唔啱
落操场玩跑步
讲嘢: |start| 系 |start + 1|
畀我睇下 |start| 点样先?
如果 |start >= 100| 嘅话 -> {
饮茶先啦
}
玩到 |结束| 为止
收工
```
當然用 `For` 循環都得:
```
|A| 从 1 行到 100
畀我睇下 |A| 点样先?
行晒
```
### 條件語句
```
讲嘢: |A| 系 2
如果 |A 系 2| 嘅话 -> {
畀我睇下 "A 系 2" 点样先?
}
唔系 嘅话 -> {
畀我睇下 "A 唔系 2" 点样先?
}
```
仲可以用`match`
```
讲嘢: 状态 係 404
match下 状态 -> {
撞见 400 -> {
畀我睇下 "Bad request" 点样先?
}
撞见 404 -> {
畀我睇下 "Not found" 点样先?
}
}
```
### 函数
用 Cantonese 實現嘅階乘:
```
$factorial |项数| 要做咩:
如果 |项数 系 0| 嘅话 -> {
还数 1
}
唔系 嘅话 -> {
还数 |factorial(项数 减 1) 乘 项数|
}
搞掂
```
返回最大值:
```
$get_max |数字1, 数字2| 要做咩:
如果 |数字1 比唔上 数字2| 嘅话 -> {
还数 |数字2|
}
唔系 嘅话 -> {
还数 |数字1|
}
搞掂
```
調用函數:
```
用下 |get_max(23, 17)|
```
函數式编程:
```
$$ x -> |x * x| @ f
畀我睇下 |f(2)| 点样先?
```
運行結果:
```
4
```
### 掟出異常
```
掟个 |ImportError| 来睇下?
```
運行結果:
```
濑嘢: ImportError()!
```
### 斷言語句
```
谂下: |1 + 1 == 3| ?
```
運行結果:
```
濑嘢: AssertionError()!
```
### 錯誤捕捉語句
try-except-finally:
```
执嘢 -> {
讲嘢: |A| 系 |B|
}
揾到 |NameError| 嘅话 -> {
畀我睇下 "揾到NameError" 点样先?
}
执手尾 -> {
畀我睇下 "执手尾" 点样先?
讲嘢: |A| 系 1
讲嘢: |B| 系 1
畀我睇下 |A, B| 点样先?
}
```
### 調用 Python 庫
```
使下 python-os
使下 python-math
```
### 面向對象編程
聲明對象 `duck`,繼承至 `object`,分別有兩個方法 `游水` 同埋 `睡觉` ,仲有一個屬性 `性别`:
```
咩系 |duck|?
佢个老豆叫 |object|
佢嘅 |性别| 系 "公"
佢识得 |游水| -> {
畀我睇下 "Duck is swimming" 点样先?
}
佢识得 |睡觉| -> {
畀我睇下 "Duck is sleeping" 点样先?
}
明白未啊?
```
調用類中嘅方法:
```
|duck()| -> |游水|: ||
|duck()| -> |睡觉|: ||
```
運行結果:
```
Duck is swimming
Duck is sleeping
```
### 棧嘅使用
```
有条仆街叫 |Deo哥|
顶你 -> |Deo哥|: 1
顶你 -> |Deo哥|: 2
顶你 -> |Deo哥|: 3
丢你 -> |Deo哥|
```
運行結果:
```
Stack: [1,2]
```
# 更多例子
### 顯示當前時間
```
使下 datetime
畀我睇下 |宜家几点()| 点样先?
```
運行結果:
```
2021-01-17 09:16:20.767191
```
### 暫停
```
瞓阵先 /* 暂停2s */
瞓 5s /* 暂停5s */
```
### 嚟個隨機數
```
使下 随机数
讲嘢: |A| 就 |求其啦()|
```
運行結果:
```
0.15008236307867207
```
### 計相關系數
聲明兩個 list,計相關系數:
```
使下 math
|2.165, 1.688, 1.651, 2.229| 拍住上 -> |A|
|2.060, 1.822, 1.834, 2.799| 拍住上 -> |B|
畀我睇下 |A同B有几衬| 点样先?
```
運行結果:
```
0.8066499427138474
```
### 仲可以机器学习?
實現 KNN 算法:
```
使下 math
|[5, 1], [4, 0], [1, 3], [0, 4]| 拍住上 -> |数据|
|'动作片', '动作片', '科幻片', '科幻片'| 拍住上 -> |标签|
讲嘢: |K| 系 3
嗌 KNN 过嚟估下 -> |[3, 0]|
```
運行結果:
```
动作片
```
線性回歸:
```
使下 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|
```
運行結果:
```
Linear function is:
y=0.530960991635149x+189.75347155122432
667.6183640228585
```
### 海龜繪圖
```
老作一下 -> {
首先: |画个圈(100)|
跟住: |写隻字("Made By Cantonese\n")|
最尾: |听我支笛()|
}
```
運行結果:

### 迷宮遊戲仔
[代碼](examples/games/game.cantonese)
運行結果:

### 各種排序同查找算法
* [二分查找](examples/algorithms/binary_search.cantonese)
* [线性查找](examples/algorithms/linear_search.cantonese)
* [冒泡排序](examples/algorithms/bubble_sort.cantonese)
* [插入排序](examples/algorithms/insert_sort.cantonese)
### 寫個網頁睇下
一個簡單嘅網頁:
```
老作一下 {
打标题 => [ "我嘅第一个网页" ]
拎笔 => [ "Hello World" ]
}
```
運行後,打開 `127.0.0.1:80` 就可以睇到運行結果:
```
cantonese examples/web/hello_web.cantonese -to_web
```

### 用粵語開發一隻 App
首先安裝 `kivy`:
```
pip install kivy
```
第一隻 App `HelloWord`:
```
使下 kivy
咩系 HelloApp?
佢个老豆叫 App
佢识得 |HelloWorld| -> {
|同我show| 下 -> "Hello World" @ |做嘢|
还数 |做嘢|
}
明白未啊?
|App运行| 下 -> |HelloApp, HelloApp().HelloWorld|
```

# 仲有啲咩?
[喺呢度](examples/)睇下更多例子.
# 点样运行?
Cantonese 可以用多種方式運行,用自己嘅虛擬機,或者翻譯成 Python 同 HTML 都得!
使用虛擬機執行(僅支援部分語句):
```shell
cantonese [-文件名] -stack_vm
```
查睇生產嘅指令:
```
cantonese [-文件名] -stack_vm -debug
```
用 Python 虛擬機運行(環境净係支援 Python3,因为噉先至符合廣東人先進嘅思想!):
```shell
cantonese [-文件名]
```
將 Cantonese 轉化成 Python:
```shell
cantonese [文件名] -to_py
```
例如:
```
cantonese examples/basic/helloworld.cantonese -to_py
```
運行嘅結果係:
```
print(" Hello World! ")
exit()
```
生成 HTML:
```shell
cantonese examples/web/web_hello.cantonese -to_web -compile
```
```html
我嘅第一个网页
Hello World
```
Vscode插件:https://github.com/Cantonese-community/vscode-cantonese
# TODOs
本項目代碼寫得好屎,歡迎各個粵語同埋編程愛好者一齊討論同貢獻!為粵語文化遺產嘅保護貢獻出自己嘅一份力量!
今後要做咩:
* 完善語法錯誤檢查
* 加多啲語句
* 完善自己嘅虛擬機
Copyright (C) 2020-2022 StepfenShawn