ojilang-cl
Meta Note
対象読者
- 暇人
- ojilangファン
Introduction
ojilang設計にチャレンジしてみた。
entry point
ゼロから言語を設計することは難しい。 そこで、むしろ既存の言語を架空の(かつ理想の)ojilangに変換するコードを書けば、おのずとojilangが出来上がるのではあるまいか。
Common Lisp
Common Lispは25の特殊形式を持つ。 すなわち、25特殊形式すべてをojilangに変換できれば、事実上すべてのCommon Lispコードはojilangに変換できることとなる。
Atom
アトムはそのまま出力することとする。
(ojilang 0) => 0
Function call
関数呼び出しは以下のように変換される。
(ojilang '(+ 1 2)) => "今度+しようよ😍❓1❓2❓どうカナ💦"
(ojilang '(print :hello-world)) => "今度PRINTしようよ😍❓:HELLO-WORLD❓どうカナ💦"
なお、これはあくまで現時点での変換である。 (すなわちアルファクオリティである。) ojilangとして自然なシンタックスになるように、安定版になるまでは頻繁に変更されることとなろう。
現行の設計では、ある程度ネストに耐えうるようになっている。
(ojilang '(+ (- 1 2) 3)) => "今度+しようよ😍❓今度-しようよ😍❓1❓2❓どうカナ💦❓3❓どうカナ💦"
IF
条件分岐は以下のようになる。
(ojilang '(if :a :b :c))
"暇ができたらさ、:Aノシ
大丈夫なら:B❤️
えっ❓違う❓❓💦💦
じゃあ:Cナンチャッテ(笑)"
LET
ローカル変数宣言は以下のように変換される。
(ojilang '(let(a)a))
"ヤッホー(^з<)🎵
Aチャン、
チュッ😘❤️ ❤️
A
(^_^)v"
BLOCK
ブロック宣言は以下のように変換される。
(ojilang '(block :a (return-from :a 0)))
"おじさんも:Aに行くの、すっごくスキ(>_<)なんだよ❗
今度一緒に:Aに行こうよ❗
0ってダメかな❓
楽しみだね🥰 🥰
なんだか、ドキドキ❤️ しちゃうね(^_^)"
TAGBODY
タグによるGOは以下のように変換される。
(ojilang '(tagbody :start (go :start)))
"最近連絡くれないけど、忙しいのかな❓
:STARTとか好きだったよね❓
そろそろおじさんと:STARTとか行こうよ😝
今日も素敵な夢が見られますように❤️ "
ojilang-cl
現行バージョン(1.2.0)では、都合11の特殊形式をサポートしている。 11しかなくとも、簡単なコードなら必要充分である。 たとえばfizzbazzは以下のように変換される。
(ojilang '(dotimes(x 100)
(cond
((and (zerop (rem x 3))
(zerop (rem x 5)))
(print :fizzbazz))
((zerop(rem x 3))(print :fizz))
((zerop(rem x 5))(print :bazz))
(t (print x)))))
"おじさんもNILに行くの、すっごくスキ(>_<)なんだよ❗
ヤッホー(^з<)🎵
Xチャン、0
チュッ😘❤️ ❤️
今度DECLAREしようよ😍❓今度TYPEしようよ😍❓UNSIGNED-BYTE❓X❓どうカナ💦❓どうカナ💦
最近連絡くれないけど、忙しいのかな❓
そろそろおじさんと#:G1741とか行こうよ😝
#:G1740とか好きだったよね❓
最近連絡くれないけど、忙しいのかな❓
暇ができたらさ、暇ができたらさ、今度ZEROPしようよ😍❓今度REMしようよ😍❓X❓3❓どうカナ💦❓どうカナ💦ノシ
大丈夫なら今度ZEROPしようよ😍❓今度REMしようよ😍❓X❓5❓どうカナ💦❓どうカナ💦❤️
えっ❓違う❓❓💦💦
じゃあNILナンチャッテ(笑)ノシ
大丈夫なら今度PRINTしようよ😍❓:FIZZBAZZ❓どうカナ💦❤️
えっ❓違う❓❓💦💦
じゃあ暇ができたらさ、今度ZEROPしようよ😍❓今度REMしようよ😍❓X❓3❓どうカナ💦❓どうカナ💦ノシ
大丈夫なら今度PRINTしようよ😍❓:FIZZ❓どうカナ💦❤️
えっ❓違う❓❓💦💦
じゃあ暇ができたらさ、今度ZEROPしようよ😍❓今度REMしようよ😍❓X❓5❓どうカナ💦❓どうカナ💦ノシ
大丈夫なら今度PRINTしようよ😍❓:BAZZ❓どうカナ💦❤️
えっ❓違う❓❓💦💦
じゃあこれはTだけど、大丈夫❓
今度PRINTしようよ😍❓X❓どうカナ💦ナンチャッテ(笑)ナンチャッテ(笑)ナンチャッテ(笑)
今日も素敵な夢が見られますように❤️
早く会いたいよ〜🥺
突然だけど、Xチャン、今度1+しようよ😍❓X❓どうカナ💦
やっぱりおじさんとはイヤかなσ(^_^);汗汗💦💦
NIL
待っててね❗❓
#:G1741とか好きだったよね❓
暇ができたらさ、今度>=しようよ😍❓X❓100❓どうカナ💦ノシ
大丈夫ならNIL❤️
えっ❓違う❓❓💦💦
じゃあそろそろおじさんと#:G1740とか行こうよ😝ナンチャッテ(笑)
今度一緒にNILに行こうよ❗
早く会いたいよ〜🥺
NIL
待っててね❗❓ってダメかな❓
楽しみだね🥰 🥰
今日も素敵な夢が見られますように❤️
(^_^)v
なんだか、ドキドキ❤️ しちゃうね(^_^)"
現行ではDECLARE
がサポートされていないので、関数であるかのように扱われている点要注意。
TODO (やるとは言っていない)
- 残る特殊形式の設計。
- 充分整合が取れるようになったら、パーズ(すなわちojilangからS式生成)できるようにする。
Conclusion
地獄絵図。