-
Notifications
You must be signed in to change notification settings - Fork 5
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
expanderのimportは実はincludeと変わらない #40
Comments
つまり、expanderの方式をこれにすると、すべてのライブラリで以下の変更が必要になります。
|
確かに、templateだと疑似的に名前空間のようなものを作れるのは良いかもしれませんね。とはいえ、大きな変更となるのでどうするか難しいところです。 |
そうなんです。。。そもそもモジュール内にオブジェクトを隠したい場面があまり思いつかない割に、この変更を行うと既存のコードにinjectやgenSymをつけなくてはならなくなってしまうので、今の所必要ないかなーと思っています。 あるいは*がついたobject・変数に自動でinjectをつけて、*がついていないprocに自動でgenSymをつけるマクロを作りexpanderの中でそれが呼ばれるようにすれば自動で対応可能ではありますね。 |
ところで、最近気づいたのですが、atcoderではコンパイル時にファイルを生成してそれをimportするみたいなことができちゃうようですねー |
それ、めちゃくちゃ凄いですね......使えるかもしれません |
そうなんです!それ以外に、zip等のlinuxコマンドも呼び出せるので、さっそくNim-ACLを圧縮して送信し、それを展開して実行するexpanderの機能を作りました。こちらのように、staticExecで外部プログラムを呼び出しています |
こんな感じに、コンパイル時にstaticExecでソースに圧縮して仕込んでおいたファイルを展開してatcoderというディレクトリを作って、そのディレクトリをそのままimportできました。 https://atcoder.jp/contests/abc256/submissions/33885705 提出の9, 10行目がNim-ACLの内容を展開してディレクトリを作成する処理をやっていて、以降import atcoder/*系の命令ができるようになっています。 問題はコンパイル時にインクルードパスが指定できないため、Main.nimがimport atcoder/hogeでhogeをimportしていて、import先のhoge.nimがatcoder/barをimportしている場合、hogeからatcoder/barが認識できないという問題があります。 今はexpanderでimportを絶対パスに書き換える操作を行っています。書き換えないでそのまま必要なソースだけコピーして固めるようにできるとなおよいです。 |
現状ではexpanderはそのまま展開するので、ローカル変数に同名の変数やobjectが別のファイルにあるとエラーが起こるかと思います。したがって、ローカル変数のimportは全体に公開されないようにしたいと思っていました。つまり、expanderで書いたimportは事実上includeになっています。
前にzer0starさんがblockを使った方式を提案していただきましたが、expanderが関数名を全部把握しなくてはならない点や同名で引数だけが違う関数が使えないといった問題がありました。
これについていろいろ調べてみたところ、genSym, injectプラグマを利用してtemplateの形で展開すると良さそうだということがわかりました。現状、ローカル変数のバッティングがあまり起こらないので、expanderにわざわざその機能を入れる必要があるかというところではあります。
The text was updated successfully, but these errors were encountered: