每個可執行的 Mojo 程式都需要有一個無參數的 main() 作為入口點。這一點和許多編譯型語言類似。
def main():
print("Hello, world!")
def 用來宣告函式,冒號後搭配縮排區塊。Mojo 與 Python 一樣,以縮排表示程式結構。
Mojo 是一種由 Modular 推動的程式語言,採用接近 Python 的語法風格,同時強調靜態型別、記憶體安全、所有權模型與高效能執行,非常適合用於高效能運算、系統程式設計與 AI 基礎設施開發。
if、while、for
Mojo 官方文件指出,Mojo 是一個特別為高效能 AI 基礎設施與異質硬體設計的語言。它吸收 Python 的可讀性,同時加入更強的型別系統與底層控制能力。
def 定義函式
每個可執行的 Mojo 程式都需要有一個無參數的 main() 作為入口點。這一點和許多編譯型語言類似。
def main():
print("Hello, world!")
def 用來宣告函式,冒號後搭配縮排區塊。Mojo 與 Python 一樣,以縮排表示程式結構。
Mojo 可以像 Python 一樣直接指定值,也可以使用 var 進行明確宣告。即使省略型別,編譯器也會在第一次賦值時推導出固定型別。
def main():
x = 10
y = x * x
print(y)
def main():
var x: Int = 10
var sum: Int
sum = x + x
print(sum)
x = 10,之後再寫 x = "Foo" 會產生型別錯誤。
Mojo 使用 def 定義函式。函式參數必須宣告型別;如果函式會回傳值,通常以 -> 型別 標示回傳型別。
def greet(name: String) -> String:
return "Hello, " + name + "!"
def my_pow(base: Int, exp: Int = 2) -> Int:
return base ** exp
Mojo 的函式預設是「不拋出錯誤」的;如果某函式可能把錯誤往外傳播,就要在函式宣告中加入 raises。
def main() raises:
var name: String = input("請輸入名字:")
print("你好," + name)
raises。
初學 Mojo 最先要學會的流程控制有三個:if、while、for。
def check_temp(temp_celsius: Int):
if temp_celsius > 20:
print("天氣偏暖")
elif temp_celsius < 20:
print("天氣偏涼")
else:
print("剛剛好")
def count_up():
var x: Int = 0
while x < 5:
print(x)
x += 1
def loop_demo():
for i in range(5):
print(i)
range() 在 Mojo 中是可迭代序列,官方文件特別提到它以產生器形式逐步生成值,而不是一次建立整批資料。
struct 是 Mojo 定義自訂型別的主要方式。它像 Python 的 class,但最大差異是:
Mojo struct 是在編譯期就固定好的靜態結構,不能像 Python 類別一樣在執行期任意動態修改。
struct MyPair:
var first: Int
var second: Int
def __init__(out self, first: Int, second: Int):
self.first = first
self.second = second
@fieldwise_init@fieldwise_init
struct MyPair(Copyable):
var first: Int
var second: Int
def dump(self):
print(self.first, self.second)
@fieldwise_init 會自動幫你建立對應欄位的初始化邏輯,能少寫很多樣板程式碼。
Mojo 很重要的一個特色是所有權模型。官方文件整理的核心概念是:一個值在同一時間只有一個擁有者;當擁有者生命週期結束,值就會被銷毀;若仍有引用存在,生命週期會被延長。
read:不可變參考(預設)mut:可變參考,可直接修改原值var:函式取得值的所有權out:常用於建構子中的 selfreadmutvardef add(mut x: Int, read y: Int):
x += y
def main():
var a = 1
var b = 2
add(a, b)
print(a) # 3
def take_text(var text: String):
text += "!"
print(text)
def main():
var message = "Hello"
take_text(message)
var 常會搭配轉移語意一起理解;對初學者而言,先掌握「函式可能接手擁有權」即可。
Mojo 支援用方括號宣告「編譯期參數」,這和一般函式括號裡的執行期參數不同。官方文件稱這種設計為 parameterization,可讓程式在編譯期做更多最佳化或生成特化版本。
def repeat[count: Int](msg: String):
comptime for i in range(count):
print(msg)
def main():
repeat[3]("Hello")
[count: Int] 是編譯期參數,(msg: String) 才是執行期參數。
Mojo 官方說明了兩個方向的 Python 互通能力:
from std.python import Python
def main() raises:
var np = Python.import_module("numpy")
var ar = np.arange(15).reshape(3, 5)
print(ar)
print(ar.shape)
練習輸入、字串串接、raises。
def main() raises:
var name: String = input("請輸入你的名字:")
var greeting: String = "你好," + name + "!"
print(greeting)
練習函式定義、回傳型別、預設參數。
def square(x: Int) -> Int:
return x * x
def power(base: Int, exp: Int = 2) -> Int:
return base ** exp
def main():
print(square(7))
print(power(3))
print(power(2, 5))
練習 List、for、range()。
def main():
nums = [12, -7, 64]
nums.append(100)
for i in range(len(nums)):
print("索引", i, "值 =", nums[i])
練習自訂型別與方法。
@fieldwise_init
struct Student(Copyable):
var name: String
var score: Int
def passed(self) -> Bool:
return self.score >= 60
def main():
var s = Student("小明", 85)
print(s.name)
print(s.passed())
練習 mut 修改原始資料。
def add_bonus(mut score: Int, bonus: Int):
score += bonus
def main():
var exam = 70
add_bonus(exam, 15)
print(exam) # 85
練習 Python 生態整合。
from std.python import Python
def main() raises:
var np = Python.import_module("numpy")
var arr = np.array([1, 2, 3, 4, 5])
print(arr.mean())
if、while、for。List 與 struct,開始寫小型資料模型。read、mut、var 差異。