こと

自分で プログラミング言語を創りたい

なんてことは 別の言語(例へば Cとか Javaとか)の達人にでもならなければ 口に出すべきでないのかも知れない

しかし 私は それを ここで言ふ

きっと それは 不完全なものだらうし 未熟なものだらう

そもそも 私は 他の言語を使ひこなしてゐない

下手くそな javascript で やっとこさ ゲームらしきものを創りあげた程度である

 

けれども 私には 動機がある

ただ なんとなく 創つてみたい といふわけでもない

 

私の心の中には ある種の ゴールがある

この言語が どのやうな形になるか といふ ゴールだ

しかし それは ここで言ひたくない

それを まさに 形にしてから 説明できると良いと思ふ

 

この構想は ずっと以前から あった

しかし 本格的に 形にしていかう と動き出してゐるのは 今年になつてからだと思ふ

 

この言語で 何かを動かすための 第一歩として

ターミナルから起動する インライン計算機のやうなものを作成してゐる

 

Bashシェルスクリプトにより Haskellコードをコンパイルした實行ファイルを起動

これによつて 入力した文字列を Haskellコードに變換してゐる

そのコードの文字列を ghcプログラムに渡し モジュールをインポートした状態で實行させ 最後に出力された結果に對し 形を少々變換させて ターミナルへ書き出してゐる

 

github.comこの インライン入力プログラムを 「ことは」 と名付けた

Haskellで書かれた メインプログラムである Conv.hs も

ghc -e で實行時に 讀み込まれる Func.hs も 私なりの問題解決法を含んでをり

それなりに話題となり得るが

今回特に 強調したいのは シェルスクリプトである kotoha.sh における

history 機能である

はっきり言つて この機能が無くても 自分の目指す目的が全く叶わないわけでもないし

計算機能自体には あまり關係がないので

全く實現できなかつたとしても それなりに諦めがつく機能ではあつた

しかし やはり コマンドを入力した後に 上矢印キーを押すと 前回の履歴が表示されたりするのは プロンプトを扱ふ上では 日常的にやることであり

こいつが無いと やはり少し 寂しい氣がするのだつた

 

しかし ネットを色々検索しつつ この機能の實装について調べても

何だか良く分からず とにかく色々と命令を追加して 實驗を繰り返し

やっとのことで 實現できた結果が このコードなのである

 

#!/bin/bash

set -o histexpand
set -o vi
history -r "history.txt"
echo "*** Kotoha Inline Coder *** 2019/3/1 yokoP"

while :
do
read -e -p "> " line
if [ "${line}" = "exit" -o "${line}" = "q" ]; then
break
fi
./Conv "${line}" | cat | while read tx; do\
echo ${tx:1:-2}; ghc -e "${tx:1:-2}" | cat |\
while read rs; do rs="${rs:0:-1}"; rs=${rs// % //};\
rs=${rs%/1}; rs=${rs///1]/]}; rs=${rs///1,/,}; rs=${rs//,/, };\
echo ${rs}; done; done
echo $line >> "history.txt"
history -n "history.txt"
done

exit 0

 

この 履歴といふ機能に關はる部分は 最初の方の

set -o histexpand
set -o vi
history -r "history.txt"

と 最後の方の

echo $line >> "history.txt"
history -n "history.txt"

といふところだ

set -o vi または set -o emacs などとすることによつて

文章の編集方式を指定してゐるが

これがないと 上矢印キーを押したとき

カーソルがプロンプトの部分より上に行つてしまふと同時に

エスケープキャラクターが入力されたことになってしまひ

Enterを押したときに このキャラクターが變數へと讀みこまれてしまつて

當然入力の解釈ができなくなつてしまふ

編集方式が指定されることにより この挙動は抑制されるやうなのだ

しかし そのままだと  矢印キー(上)を押しても 何も反應がない状態となる

これはこれで害はないのだが やはり履歴機能をつけたい

といふことで

set -o histexpand

としてゐる

この設定法も 試行錯誤でみつけたもので ネット上で調べても 全く分からなかつた

ちなみに これを

set -o history

としてしまふと 履歴の挙動は おかしくなる

原因は不明だが 何故か シェルスクリプトそのものを履歴として格納しだすのだ

 

履歴ファイル history.txt といふのを作業フォルダにつくり

入力された文字列を 變數 line に格納して それを履歴ファイルへ書き出す

といふ形を取つてゐる (historyコマンドを使ふ方法は うまく行かなかつた)

このファイルヘ書き込むと同時に そのファイルから新しいものを讀み込んでゐるのが

history -n "history.txt"

の部分である

これをやることで 入力して結果を出し 次のプロンプトが出たとき

上矢印キーで 直前の入力をそのまま表示することに成功した

履歴を削除したければ history.txt を編集すれば濟むことだ

今のところ とても快適に機能してゐる