GitHub

ZuLanguage

アスキーアートで図を描くとそれがそのまま実行される、フローチャート指向言語です。

性格判断を行う程度のプログラムが書けます。

サンプルプログラム

sample.zu

 *-----------------------*
 |ask "do you like ruby?"|            *--------------------------------*
 |                       +------------> ask "then, do you like python?"|
 *------------------+----*            |                                |
                    |                 *-----+------------------------+-*
                    |                       |                        |
                    |                       |                        |
                    |            *----------v----------------------* |
  *-----------------v-----------*|say "maybe you don't like LL..." | |
  |say "maybe you like Haskell."|*---------------------------------* |
  *-----------------------------*                                    |
                                      *------------------------------v---*
                                      |                                  |
                                      |say "maybe you like OCaml."       |
                                      *----------------------------------*

実行結果:

yhara@meteor:~/src/zu/zu-0.1.0 % ./zu sample.zu
do you like ruby? [y/n]
> n
then, do you like python? [y/n]
> y
maybe you like OCaml.

(内容に特に意味はありません。)

ダウンロード

./zu sample.zu

もしくは

ruby zu sample.zu

として起動してください。

仕様

  • 全ての命令は四角いセルに囲まれていなければならない。セルは「*」と「-」と「|」で描画する。
  • セルどうしを「+--->」など矢印で繋ぐことで分岐を表現する。
  • セルにはパーサが見つけた順に番号が振られる。セル左上の「*」が上にあるほど(同じ行なら左にあるほど)若い番号が振られる。
  • 許される命令は(今のところ)以下の2種類。
    • ask 文字列 : yesかnoかの質問をする。セルから2本の矢印が伸びていなければならない。noのなら番号の小さいセルに、yesのなら番号の大きいセルに進む。
    • say 文字列 : 文字列を画面に出力する。

余談

合宿

プログラミング言語「ず」は第1回言語開発合宿にて開発されました。

パーザ

グラフのパーザ部分はTextGraphとして公開しています (用途があるかはともかく)。

命名の由来

「C言語」「D言語」などアルファベット一字の言語名が許されるならば、 仮名一文字の言語があっても良いのではないか、という発想からこの命名に至った。

単に表を埋めたかったという理由がなくもない。

「ず」を選んだのはもちろん、「図」から来ている。

今後の予定

フィボナッチぐらいは計算したいよね。

イメージ:

fib.zu
    *----*  *--------*                                      
    |i=0 <--+ n=getn |                                        
    *--+-*  *--------*                                    
       |                                        
   *---v-*  *-----*  *----------------------* 
 +->i==0 f-->i==1 f--> a=pop; b=pop; push a |
 | *----t*  *-t---*  *---+------------------*                    
 |       |    |          |      
 |       |    |       *--v---*  *-----------*
 |  *----v-**-v----*  | i==n t--> print a+b |
 |  |push 1||push 1|  *--f---*  *-----------*                           
 |  *-+----**-+----*     |                                        
 |    |       |   *------v---*                      
 |    v       |   | push a+b |                         
 +------------+   *------+---*                                        
      ^                  |
      +------------------+

実装しないといけないもの:

  • 曲がった矢印のパース
  • 左上以外からも開始できるようにする(入る矢印がないセルが開始地点)
  • 「t」「f」によるルート分岐
  • 「pop」「push」によるスタック操作
  • 数値の入力関数(getn)
  • 数値の出力関数(print)
  • 矢印から矢印への合流

モジュール機能とか

   fib
  *---------------------------------------------*
  | *--------*                         *-------*|
  | |input(x)+-->                    --> output||
  | *--------*                         *-------*|
  |                                             |
  *--------^-------------+----------------------*
           |             |
 main      |             |
*----------|-------------|----*
| *--------+---*         |    |
| |a,b = getn  |         |    |
| *------------*         |    |
|                        |    |
| *----------*           |    |
| |say result<-----------+    |
| *----------*                |
*-----------------------------*

関連する話題

2006年のICFPCにて「2D」という言語が発表されたようです。

「2D」と「CIRCS」で検索すると良いです。

source: ZuLanguage.hd
View on github | Report issue