GlueLangのif文相当の処理をガラッと変えてみた

Pocket
LINEで送る

今日は息抜きにGlueLangをいじっておりました。といっても言語の開発なので、処理系のバグと、スクリプトのバグの両方に気をつけなければならず、なかなかイライラするものですが・・・

機能追加1: 複合コマンド

続きを読む GlueLangのif文相当の処理をガラッと変えてみた

Pocket
LINEで送る

OSCでのGlueLangの発表無事終了

Pocket
LINEで送る

金曜日にもかかわらず30人くらいに話を聞いていただきました。質問もたくさんありがとうございました。

取り急ぎ。

Pocket
LINEで送る

日記(実験データ解析にGlueLang投入から慌ててwhileを実装)

Pocket
LINEで送る

昨日から実験データの解析をしており、締め切りが遠いことからGlueLangを投入してみました。これが記念すべき最初のコードです。書きなぐりなので意味を追って読まないでください。

続きを読む 日記(実験データ解析にGlueLang投入から慌ててwhileを実装)

Pocket
LINEで送る

GlueLangが変態言語になるかどうかの瀬戸際である

Pocket
LINEで送る

本日は久々にGlueLangを作りこんでいました。読んでてもほとんどの人が分からんと思いますが作業日誌です。いや、読んでも分からんとか言ってたら絶対普及しないので、この前LTやったスライドを貼り付けときます。

ファイルや変数に直接文字列を指定可能に

今まではechoを書かないとファイルや文字列に文字が入って行きませんでしたが、要らなくなりました。

uedambp:GlueLang ueda$ cat fuge.glue 
import PATH

file f = 'abc'
str s = 'cde'

cat f
echo s

続きを読む GlueLangが変態言語になるかどうかの瀬戸際である

Pocket
LINEで送る

GlueLangにバックグラウンドジョブの機能を追加

Pocket
LINEで送る

今日の作業でGlueLangにシェルの「&」に相当する部分を追加しました。&を>>や>>=でつながっているコマンド達(ジョブ)の後ろにくっつけると、Glueはそいつらを起動してすぐに次の行に制御を移します。

続きを読む GlueLangにバックグラウンドジョブの機能を追加

Pocket
LINEで送る

今日のGlueLang開発日誌(シグナル処理、whereでの条件指定等)

Pocket
LINEで送る

今週末も時間をやりくりしながらGlueLangの開発を進めました。昨日の作業に加え、今日はシグナル処理を改善して、中間ファイルと作業ディレクトリが残らないようにしました。ただ、何でちゃんと動くのか分からないという有様なので、dashのコードを読んでちゃんと勉強せんといかんなあと思います。

あと、2月末にとうとうお披露目のプレゼンをするかもしれないので、次のような機能をデモ程度に実装しました。

続きを読む 今日のGlueLang開発日誌(シグナル処理、whereでの条件指定等)

Pocket
LINEで送る

GlueLangでとうとうwhereが使えるように

Pocket
LINEで送る

週末プログラマー上田Zです。(きもちわるい)

どうしても実装したかったwhereを本日ついに実装しました。まだスコープが分かれてませんが。

whereの使い方

例えばシェルスクリプトでこう書いたとします。ファイルaとbを作って、diffで比べています。

seq 8 > a
seq 10 > b

diff a b

続きを読む GlueLangでとうとうwhereが使えるように

Pocket
LINEで送る

今日もruminを試し、作っていただいたGlueLangのシンタックスハイライトを試した

Pocket
LINEで送る

明日までにある予稿を書かなければならんのですが・・・。もう眠い・・・。ということで昨日のrumin再チャレンジと、GlueLangのシンタックスハイライトを作っていただいたので試してみます。

続きを読む 今日もruminを試し、作っていただいたGlueLangのシンタックスハイライトを試した

Pocket
LINEで送る

ruminとGlueLangについての日記

Pocket
LINEで送る

日曜月曜は研究そっちのけでGlueLangの実装をしていました。

GlueLangはさておき、某所でrubyでプラグインを書けるruminというmruby製のエディタを作っている人たちがいます。誰かは、このように広告付きのブログである等の理由から(といっても当然サーバ代にもならない稼ぎですが)言いませんが、通りすがりのフリーソフト好きとして、ruminを試してみようかと。

結論から言うと、俺の環境ではうごかんだお!これ見てたらちゃんと対応していただきたく。GlueLangはC++11のコンパイラさえあれば(そして最新ならば)MacでもLinuxでもちゃんと動くど。たぶん。

続きを読む ruminとGlueLangについての日記

Pocket
LINEで送る

glueで年末年始シェル芸問題集を解いた雑感(Q4まで)

Pocket
LINEで送る

私以外のコントリビュータも出現し、試してくださる方も出て引くに引けない状況のGlueLangですが、ちょっと使った例と、自分で使ってみたフィードバックが必要かなと思い、自分で出題した年末年始シェル芸問題集の問題をGlueLangで解いてみようと思いました。

答えはMac用です。

Q1

今のところPATHをGlueLangに読ませていないので、コマンドを使うときはimportでパスを指定するか、フルパスで呼び出す必要がありますが、xargsに渡したgmd5sumではフルパスでしか指定できない問題が発覚(というよりウスウス気づいてましたが・・・)。あとはオプションをいちいちシングルクォートするのはやはり面倒かなと。

あとは、importの後の空行にスペースを入れるとちゃんとパースしてくれませんね・・・。

import /usr/bin/ as ub
import /usr/local/bin/ as ulb

ub.find '/Users/ueda/' '-type' 'f'                  >>=
ub.grep '-i' '\.jpg$'                               >>=
ub.sed 's/.*/"&"/'                                  >>=
ub.xargs '-n' '1' '/usr/local/bin/gmd5sum'          >>=
ub.sort '-s' '-k1,1'                                >>=
ulb.awk '{if(a==$1){print b;print $0}a=$1;b=$0}'

パスやその他環境変数については、

import PATH
import LANG

というように簡単に読み込めるようにしようかと思います。

オプションについてはハイフンで始まったり数字で始まるものはクォートを省略できる方がいいかも。

Q2

ワンライナーなのでほとんど普通のシェルスクリプトと変わりません。しかし、標準エラー出力の制御を今のところ実装していないというのはやはり使いづらい。

import /usr/local/bin/ as ulb
import /usr/bin/ as ub

ub.curl 'http://www.flightradar24.com/_json/airports.php' >>=
ulb.jq '.' >>= ub.grep '-C' '6' 'HND'

エラーは普通にリダイレクトでとれるようにしておけば良いか・・・。次のような感じで。

ub.curl 'http://www.flightradar24.com/_json/airports.php' log> '/dev/null' >>= ...

ログを見るだけなら上の書式にして、標準エラー出力をGlueLang内で積極的に使うときは、fileの後に二つファイルを並べる方式になると思います。

# ファイルオブジェクトfにcurlの標準出力、errにエラー出力が入る
file f err = ub.curl 'http://www.flightradar24.com/_json/airports.php'

Q3

基本的にはワンライナーをGlueLangの方法に書き換えるだけです。

import /usr/local/bin/ as ulb
import /usr/bin/ as ub

ub.seq '1' '1000'        >>=
ulb.awk '{for(i=1;i<=$1;i++){printf("%d ",i)}{print ""}}' >>=
ub.tr ' ' '*'            >>=
ub.sed 's/\*$/)/'        >>=
ub.sed 's:^:1/(:'        >>=
ub.bc '-l'               >>= 
ub.tr '\n' '+'           >>=
ub.sed 's/$/1/'          >>=
ub.bc '-l' 

しかし、もとがワンライナーなので意味不明なのは、GlueLangの宣伝としてはどうなのか??

ということで、別解をいただきましたので、実装してみたいと思います。

はい。

/usr/local/bin/clisp '-x' '(! 2015)' '-q'

Q4

このbashのワンライナーを書き直せばよいのですが・・・

uedambp:~ ueda$ a=$(curl http://blog.ueda.asia/misc/message2015.txt) ; 
while a=$(echo $a | base64 -D) && echo $a ; do : ; done

・・・さて、whileがないGlueLangでどうやって処理しよう・・・。コマンド作っちゃえ。ということで、次のようなGlueLang用のコマンドを作りました。

uedambp:GlueLang ueda$ cat ./stdcom/loop-serial 
#!/bin/bash
# loopserial command
# usage: loopserial <commmand> <args...>
# Multiapply trys the command until the command
# is failed, and outputs the output of the last successful trial.

# version: "Sat Jan 10 16:58:28 JST 2015"

# This command should be rewritten with C/C++.

[ "$#" -lt 1 ] && exit 1

tmp=/tmp/$$
"$@" > $tmp-keep

while [ $? -eq 0 ] ; do
	mv $tmp-keep $tmp-out
	cat $tmp-out | "$@" > $tmp-keep 2> /dev/null
done

cat $tmp-out

rm -f $tmp-*
exit 0

んで、Glueで使ってみます。

uedambp:SHELL_GEI_2015SP ueda$ cat Q4.mac.glue 
import /usr/bin/ as ub
import /bin/ as b
import /Users/ueda/GIT/GlueLang/stdcom/ as std

ub.curl 'http://blog.ueda.asia/misc/message2015.txt' >>=
std.loop-serial '/usr/bin/base64' '-D'

はい実行。

uedambp:SHELL_GEI_2015SP ueda$ ../../glue Q4.mac.glue 2> /dev/null
:(){: | : &};:

bashで書いているコマンドを実行していることで他力本願極まりないですが、bashで書いたコマンドをCで書き直して、GlueLangの付属コマンドにしてしまうつもりです。GlueLangを作るにあたり、もともと制御構文をなくしたいという動機があったので、これでいいんでないかと思います。

ただ、whileがないと初心者向けにはならないので、ゆくゆくは実装するつもりです。しかし、コマンドを繰り返し実行するパターンにはあまりバリエーションがないので、loop-serialのようなコマンドをいくつか作ってそっちを使うことを推奨したいと考えています。

おわりに

今回は4問しか解きませんでしたが、これだけでも改善点がいろいろ出てきたので、開発に移りたいと思います・・・。やっぱりPATH周りは早くなんとかしたいかなと。

おしまい。

Pocket
LINEで送る