博客 / 詳情

返回

耗時一週,我的編程語言 Hulo 新增 Bash 轉譯和包管理工具

嘿,腳本開發者們!

還記得上週我介紹的那個能編譯成 VBScript 的現代編程語言 Hulo 嗎?這周它又有了重大更新!

🚀 本週重磅更新

1. Bash 轉譯器正式上線!

是的,你沒看錯!Hulo 現在不僅支持 VBScript,還支持 Bash 了!

這意味着你可以用同一套現代語法,同時生成 Windows 和 Linux/macOS 的腳本:

// main.hl
class User {
    pub name: str
    pub age: num

    pub fn to_str() -> str {
        return "User(name: $name, age: $age)"
    }

    pub fn greet(other: str) {
        MsgBox "Hello, $other! I'm $name."
    }
}

let u = User("John", 20)
MsgBox $u.to_str();
$u.greet("Jane");

在文件所在的工作目錄執行 hulo main.hl 命令即可得到兩份轉譯後的文件(當然 Hulo 命令還支持其他功能,以及從 huloc.yaml 讀取配置,在此就不一一列舉了,可以通過 hulo -h 查看,或者查詢官方文檔)。

生成的 Bash 代碼:

#!/bin/bash
function create_user() {
  local name=$1
  local age=$2
  declare -A user
  user["name"]=$name
  user["age"]=$age
  echo "$(declare -p user)"
}
function user_to_str() {
  eval "declare -A user=${1}"
  echo "User(name: $name, age: $age)"
}
function user_greet() {
  eval "declare -A user=${1}"
  local other=$2
  MsgBox "Hello, $other! I'm $name."
}

u=$(create_user "John" 20)
MsgBox $(user_to_str $u)
user_greet $u "Jane"

生成的 VBScript 代碼:

Class User
  Public name
  Public age
  Public Function to_str()
    to_str = "User(name: " & name & ", age: " & age & ")"
  End Function
  Public Function greet(other)
    MsgBox("Hello, " & other & "! I'm " & name & ".")
  End Function
End Class
Set u = New User
u.name = "John"
u.age = 20
MsgBox(u.to_str())
u.greet("Jane")

至此,看起來一切正常對嗎?不幸的是,在 Bash 平台上的代碼是無法正常運行的,他會因為缺少 MsgBox 而報錯,這是因為我們在 Hulo 代碼中使用的是 MsgBox 而非 echo。因此,如果你想讓他正常運行就需要將 MsgBox 更改為 echo 在進行轉譯。但是,這不就和 Hulo 的跨平台宣傳產生衝突了?hhh,原因是類似 use MsgBox = If<$platform == "vbs", MsgBox, If<$platform == "powershell", Write-Host, echo>> 的語法糖還沒有完工,造成了命令沒法轉譯的割裂感。Hulo 也不想採用硬編碼的方式強行把命令在轉譯器中做轉換,由此帶來了比較差的開發體驗。這個特性將在未來的版本實現,請給 Hulo 以時間。

Ps. Hulo 將這個特性稱之為命令體操,為了實現這個特性,Hulo吸取了 TypeScript 類型體操的所有優點,這意味着這套系統將連帶着 Omit、Pick、Exclude 等類型工具一同構成強大的命令系統。

2. 包管理工具 HLPM 來了!

hlpm 的核心功能就是分發第三方庫,由於 import 暫時不支持模塊解析,儘管 hlpm 核心功能已經開發完成,但是調用模塊的運行還是不支持的。但是,你可以用其先初始化項目,並編寫 hulo.pkg.yamlhuloc.yaml 文件控制項目的編譯過程。這有點類似於 package.jsontsconfig.json 的作用。

# 初始化新項目
hlpm init my-script

# 運行腳本
hlpm run test

# 運行文件,等價於 hulo main.hl
hlpm run main.hl

3. 交互式開發環境 Hulo-REPL

新增了 hulo-repl 命令:

  • [x] 代碼補全
  • [x] 主題設置
  • [ ] 實時詞法分析、語法分析調試(即將上線)
  • [ ] 實時轉譯(即將上線)
PS C:\hulo> hulo-repl

  Hulo-REPL dev

  ➜  Type help for commands, exit to quit

>>> e
      else    Else statement
      enum    Enum declaration
      extend  Extend declaration
      exit    Exit the REPL

🔧 技術改進

重構了 VBScript 轉譯器

  • 代碼結構更清晰,更易維護
  • 修復了echo "Hello World"字符串轉譯問題

本次更新是一次破壞性更新,v0.1.0 版本所實現的功能可能部分無法在 v0.2.0 運行。尤其是涉及到 import 的地方,模塊的設計會在接下來更近。

配置系統升級

  • hulo 命令現在支持從工作目錄的 huloc.yaml 讀取配置
  • 更靈活的項目配置管理

🚧 下一步計劃

  1. Batch 轉譯支持 - 讓 Hulo 在 Windows 上更強大
  2. 包發佈系統 - 讓社區能分享和複用代碼
  3. Import 系統 - 支持第三方庫導入
  4. 命令體操 - 更智能的代碼生成

💭 寫在最後

項目地址:https://github.com/hulo-lang/hulo

如果你覺得這個項目有意思,歡迎在 GitHub 提 issue 或參與討論!給個 Star 支持一下,讓更多人看到這個項目。

你覺得這種"一次編寫,多平台運行"的腳本開發方式怎麼樣?有什麼建議或想法嗎?

user avatar dragonir 頭像 gouguoyin 頭像 guyan0319 頭像 roseduan 頭像 mex 頭像 dubingxuan 頭像 moonbit 頭像 kevinyan 頭像 zhujiu 頭像 idiomeo 頭像 zxc7563598 頭像
11 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.