You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session. Dismiss alert
Rubyは内部DSL(Domain Specific Language)に向いている言語と言われます。Rake, RSpec, Rack, Sinatraなどは内部DSL on Rubyの代表的なサンプルです。Rubyの構文のユルさとメタプログラミングが内部DSLを容易にするんですね。 しかし正直僕は、何が内部DSLで、何が内部DSLでないのかがわかっていません。人が何をさして「これは内部DSLである」と言っているのかがよくわかりません。 そんなわけで… 以下では、Userクラスの設計を通して内部DSLらしきものを作ってみます。このイテレーションに対して「ここからが内部DSLだよ」「これは内部DSLとは呼ばないよ」と、誰か僕に優しく教えてくれませんか? Userクラスの作成 Userクラスはユーザ情報を管理するクラスです。ファイル名はuser.rbとします。 まずはユーザの登録機能を作りま
PerlでWebAppの開発に必要なN個のこと - Islands in the byte stream の Scala 版です。 あるプログラミング言語で実際にWebAppを開発できるようになるまで、何が必要だろうか。言語仕様の習得は終えているとしよう。おそらく、最低限以下のような知識が必要だと思われる。とりあえずScalaについて知っていることを書いた。 パッケージマネージャ sbt が全てやってくれる。Scala のバージョン管理も、ライブラリのバージョン管理も。 http://www.scala-sbt.org/ Maven や gradle を使用することもできる。 アプリケーションサーバ Scala の Web アプリは 2 つのタイプに分けられる。Java の Servlet API を使用するものと、使用しないものである。どのフレームワーク、ライブラリを使うかによって変わっ
PythonはDSLが苦手でしょうか、って話をチラッと目にした。あんまりDSLって知らないけど、そんなに得意ってことはないんじゃないかと思う。Pythonってのは構文的に遊びが少ないように考慮して作られてるし、そもそもPythonは「実行可能な擬似コード」って言われるぐらいにシンプルなんで、わざわざ新しくDSLを仕立てなくても、って気もする。 ただまあ、工夫の余地がないかというとそうでもなくて、例えば if not INPUT: EXIT SORT REVERSE PRINT のような、独自言語っぽい見栄えのコードを書けないってこともない。上のコードは、コンソールから一行読み込んで、文字をソートしてひっくり返し、コンソールに出力するPythonスクリプトだ。 えーと、上のコード、Pythonスクリプトと言ったのは嘘ではないけど、実行時にちょっと細工がいる。こんな感じで起動しなければならない
LL Planets の「メタプログラミングの光と闇」で Haskell について話してきました。Perl、Python、Ruby が概ね内部 DSL を作る話だったのに対し、Haskell では外部DSLを内部に埋め込むという話をしました。短い時間で説明不足になった感があるので、この記事で二点ほど補足します。 Haskell では文法がうまく設計されており、コードを書けば自然とDSLっぽくなるので、わざわざ内部DSLなんて言わない。それよりもコンビネータという考え方を学ぶ方が新しい視野がひらけてよい。 Haskell ではパーサーを作るのが簡単。だから自分で言語を作るのも簡単。その言語を外部ファイルから読み込んでもいいし、HERE DOCUMENT のように内部に貼付けることもできる。 関数を二項演算子として扱う Haskell では関数をバッククォートで囲むと二項演算子になります。 i
# -*- coding: utf-8 -*- """ 近頃はスクリプト言語のシンタックスを乱用、じゃなくてクリエイティブに使って違う言語のようにすると「DSL」と呼べるらしい。 ならテングもpythonでマイクロDSL。 """ def main(): """ ベースクラス。ディフォルトの挙動(はつまらない)。 """ hoge=AttrChain() print hoge.foo.bar.baz # >>> foo.bar.baz """ 「.」によるパス表記 """ class PathAttrChain(AttrChain): def _end(self, path_func=lambda p: p): import os.path path=os.path.join(self.kw.get('base','/'), *self._tuple()) return path_func
あの日胸に抱いたのは、ささやかな希望と憧れ。訪れたのは、速すぎるコードと尽きせぬ課題。 http://hackage.haskell.org/package/Paraiso-0.1.0.0 うごごご・・・ 以前はただ文字列の結合でコードを生成していたバックエンドまわりを大幅に強化し、データフローグラフ組立て→解析と最適化→計画立案→抽象文法→コードという段階を踏んでコードを作るようにしましたよ。その結果、CUDAをサポートするようになった。仕組みを悩みながら決めるまでに2ヶ月くらいかかったが、CUDAバックエンド作るのはすぐだったことに驚く。 うちらの分野で使われている既存のコード(CPU向け)と対決しても遜色ない性能が出ますし、(Paraisoとしての)ソースコードには指一本触れずにGPUに移行できる。なにより、ソースの変更は1、2行で、1万行以上にも及ぶC, CUDAコードを操り、性能
それは、数値計算の概念を変えてしまうような出会い。それは、新たなるプログラミング言語の始まり。 Paraisoでとにかく何か動いているように見えるものが生成できるようになりました。 https://github.com/nushio3/Paraiso/ 遊び方はREADMEに書いてあります。ライフゲームのルールを記述したソースはこれで、本質的なとこだけ抜き出すと adjVecs :: [Vec2 Int] adjVecs = zipWith (\x y -> Vec :~ x :~ y) [-1, 0, 1,-1, 1,-1, 0, 1] [-1,-1,-1, 0, 0, 1, 1, 1] buildProceed :: Builder Vec2 Int () buildProceed = do cell <- bind $ load Rlm.TLocal (undefined::Int)
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く