希望能讓程式員自然而然地表達他們的想法,它嘗試解決如下問題:
- 大多數語言沒能吸取曆史教訓
- 大多數語言受到宗教性的推崇,擁有一個過于狂熱的社群,是以難以改正自己的錯誤
- 有些語言為程式員做得太少,有些語言為程式員做得太多
- 有些語言提供了太少的抽象,有些語言提供了太多的抽象
- 有些語言太不顧及可用性,遊戲語言過于重視可用性而忽視了可用性之外的東西
- 有些語言從數學和邏輯那裡學得太少,有些語言學得太多
- 有些語言太不顧及類型,有些語言對類型考慮過多
解決這些問題需要很多程式員的經驗。是以 Yin 歡迎程式員貢獻經驗和觀點,以便做出最好的決策。

狀态
目前 Yin 語言處于設計階段,很多設計上的決定已經做了,很多還沒做。如果你希望學習如何設計和實作一門語言,那麼 Yin 語言值得一看。
已實作的特性
- 基本類型(整型、浮點、數組、記錄)
- 基本操作符(算術)
- 作為一等公民的函數(閉包)
- 類型系統(不完整,union type)
已實作的工具
- 解析器
- 解釋器
- 類型檢測
等待實作
- 測試架構
- 編譯器
- 運作時環境
示例
數組
[1 2 3 4 5]
表達式
(* (+ 2 3) 4)
yin 語言采用了 lisp 所使用的基于 S 表達式的文法,這是因為作者認為 lisp 的基于 S 表達式的文法是
最簡單、最好看的文法:
- 避免“歧義”,無需記憶運算符優先級
- 基本算術操作和函數調用在文法上達成完美統一
- 字首表達式和括号,更容易對齊,因而更美觀
類型系統
(define fact
(fun ([x Int] [-> Int])
(if (= x 0) 1 (* x (fact (- x 1))))))
(fact 5) -- 120
--
表示注釋。
if 同樣是函數,第一個參數是條件,第二個參數是條件成立時的表達式,第三個參數是條件不成立時的表達式。
函數采用如下格式:
(fun ([x 輸入類型] [-> 輸出類型]) 函數體)
使用
define
綁定函數的名字。
交替遞歸
判斷奇偶性的函數:
(define even
(fun ([x Int] [-> Bool])
(if (= x 0)
true
(if (= x 1)
false
(odd (- x 1))))))
(define odd
false
true
(even (- x 1))))))
(even 10) -- true
(even 11) -- false
(odd 10) -- false
(odd 11) -- true
實作
Yin 最初使用 Typed Racket 實作,然而由于 Racket 系統報錯資訊的不精确,造成比較低的開發效率,是以後來換成了 Java。得益于簡單的文法設計,Yin 的具有精确報錯定位能力的解析器,實作隻花了 2 小時,500 行 Java,且不依賴 Lex、Yacc 類工具。以後,Yin 語言将能夠解釋自己,進而能使用自身實作編譯器,也就是自舉。
許可
Yin 語言是開源的,使用 AGPLv3 許可。