夜空日和 [出張版]

星を見上げながら、今日を語ってみようか

 

スポンサーサイト


Category: スポンサー広告   Tags: ---
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

DSLって難しい


Category: 雑記   Tags: ---
Rubyのメタプロ本を読んで、いつかはDSLを作ってみたいと思っていました。
んで、研究で必要になったプログラムに対して、入力の簡略化のために、DSLをこしらえました。

最初に「こう書きたい!」という思いがあって、それを具体化するために試行錯誤しましたが・・・
内部DSLには、向き不向きがあるのだなっと、当たり前のことを感じる結果でした。

1. 演算子が自由に使えない
Rubyでは、代入に関する演算子のオーバーライトが認められていません。
また、 ? などを演算子にすることも出来ません。
必然的に、「こう書きたい」という思いを、修正しなければなりません。
(※裏ワザ有り)

2. "変数"を扱いづらい
DSL内部の変数を定義して使おうとすると
 ・宣言部をどのようにするか
 ・使用箇所をどうやって見分けるか
この2点が課題になりました。
必然的に宣言部では Symbol or String を使用することになります。
しかし、使用箇所で Symbol や String を使用した場合、それがどこで宣言されたどの変数なのかを判定しなければなりません。
また、変数由来の演算 (メソッド) を定義した場合、Symbol や String ではそれが使いづらくなってしまいます。
それが嫌だったので、今回は method_missing で・・・と思っていたのですが、DSLで instance_eval を使用した場合、コンテキストが変わってしまうため、宣言された変数の情報をどうやって共有するかが課題となってしまいました。
手段としては、グローバル変数 or 定数 or lambdaによる共有スコープ の3つが考えられます。
どれも一長一短ですが、今回は実験的に、共有スコープを採用しました。 (理由なし)

3. 中間構造を決めにくい
今回は hash を噛ませていますが。
初期のプログラムでは、DSLから直接アルゴリズムが使用する中間構造を生成していました。
しかし、DSLを全て読み込んでからでないと決まらない情報があったため、直接導出が困難でした。
今は hash を通して中間構造の生成を別にしていますが・・・

4. アルゴリズムへの汚染を排除しなければならない
当たり前のことですが。
DSLに使用するメソッドを、アルゴリズムに持ってくるのは危険です。
今回は DSL をFile.read で一度読み込んで、それを解析用クラスのインスタンスに入れることで解決しています。
( クリーンルームと呼ばれる手法らしいです )
また、ファイルから一度文字列として起こすことで、DSLを書き換えることもできます。
例えば 「 := 」 という演算子はRubyでは無理ですが、このフェーズで書き換えてしまえば使用はできます。
(※これが裏ワザ。 単純なトークン置換)

結論として。
DSLから直接 (または言語支援を得て直感的に) 中間構造に起こせる内容なら、内部DSLでも問題ないと思いました。
私の場合は、パーサージェネレータで一度言語を作った方が速かったのでは・・・と思っています。

まぁ、今回は hash さえ受け取れれば実行できる構造にしたので。
Raccを使用して外部DSL化することも可能かもしれませんね。 (あれ、泥沼?)

スポンサーサイト

[c++][vim] quickrunでコンパイルオプション追加


Category: 技術   Tags: ---
vim-quickrun hookの続編。

c++でコンパイルする場合、ライブラリ指定が必要となる場合があります。
#pragmaと似たように、スクリプトにライブラリ指定が書ければなーと。

今回は、次のような感じにしました。
/* QuickRun: cmdopt << -Wall : */
/* QuickRun: runner = system : */
「<<」は設定の追加、「=」は設定の変更としています。
これの場合、cmdoptには設定を追加、runnerはsystemに変更・・・となるはずです。

 

[ruby] RoRでサービス作ってみました


Category: 雑記   Tags: ---
rails + heroku 使って、初めてサービス作ってみました。

Joysound Request Ranking Tracker

↑ のリポジトリ [github]

Joysoundのリアルタイムリクエストのランキングを、時系列(1日ごと)に見るサービスです。

現在は、自分しか使うことを考えてないので、指定したアーティストしか見れません。
他のアーティストを監視したいなら、上記リポジトリを使って、自分でサービス立ててください m9( ゚д゚)
( 今後、任意に増やせるようにするか考え中 )

・・・うん、俺が欲しいから作っただけだよ!

[tex] vim-quickrunで指定ファイルからコンパイル


Category: 技術   Tags: ---
EmEditor/M's TeX Helper 2 では、ファイルの先頭に
%%%Root main.tex
と記述すれば、どんなtexファイルでも同じディレクトリの main.tex からコンパイルしてくれます。
(記憶が正しければ・・・)

vim-quickrunでも同様のことがしたかったので、そんなスクリプトを書いてみました。
( というか、vim-quickrun/autoload/quickrun/hook/shebang.vim を少し書き換えた程度です)

 

熱中症には気をつけましょう


Category: 日々徒然   Tags: ---
熱中症だろうが、熱射病だろうが、それは言葉の定義次第なので。

ここ数日、ジメジメで暑い日が続きますね。
ニュースでも熱中症患者が云々と流れていますが、他人事ではありませんでした (´・ω・`)

 

10 2017
SUN MON TUE WED THU FRI SAT
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -

09

11


 
プロフィール

ひでたそ

Author:ひでたそ
Comment:
現役大学生で天文好き。
今日もどこかで、上を見ながら歩いています。

 
 
 
最新トラックバック
 
 
検索フォーム
 
 
 
ブロとも申請フォーム
 
QRコード
QRコード
 

Archive   RSS   Login

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。