サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
Pixel 9
d.hatena.ne.jp/einblicker
Java | 18:44 | パラメタ多相を持つOO言語って実はGADT相当のことが表現できるんじゃないか、みたいなことが気になったのでググっていたらこんなものを発見。Generalized Algebraic Data Types and Object-Oriented Programming予想通り、Genericsを持つOO言語ではGADT相当のことができるとのこと。具体的には、代数的データ型*1に加えて以下の三点の表現力があればGADTが書けるらしい。コンストラクタごとにデータ型の型パラメータを変えられること。Javaでは class S{}; class D1 extends S{}; class D2 extends S {} のように型パラメタを特殊化+継承で可能。型パラメータを持つデータ型の定義中に、他の型で型パラメータを特殊化した自身の定義を使用可能であること。Javaで
Java | 19:36 | ふと、Javaってジェネリックメソッドを持つクラスでrank-N typeが書けるのだから存在型だってエンコードすることができるはずだよなぁと思った。そしてJavaでは幽霊型も使えるので、この2つを組み合わせればScalaのパス依存型っぽいことができそうな気がする。というわけで、試しに Family Polymorphism in Scala — Familie Kneissl のグラフライブラリの例をJavaで書いてみることに*1。ただしJavaはtypeをメンバーに持てないので、リンク先にあるOnOffGraphのようなGraphを継承したクラスは、キャストを使わないと作れないです。その点だけご注意を。 //この型パラメ−タTは幽霊型。実体は無く単なる目印としてだけ使われる。 class Graph { //Graphクラスのコンストラクタはprivate
Scala | 19:07 | Scalaでやってみた。ただのお遊びです。 GADTs型安全なDSLとかを書くのに使えるらしい。 sealed trait Expr[T] case class I(x: Int) extends Expr[Int] case class B(x: Boolean) extends Expr[Boolean] case class Add(lhs: Expr[Int], rhs: Expr[Int]) extends Expr[Int] case class Mul(lhs: Expr[Int], rhs: Expr[Int]) extends Expr[Int] case class Eq(lhs: Expr[Int], rhs: Expr[Int]) extends Expr[Boolean] Mul(Eq(I(123), I(324)), I(456)
Scala | 19:42 | Scalaのリハビリも兼ねて、以前から興味があったScalaの型レベル計算を使ってFizzBuzzを書いてみました。Scalaには既にmetascalaやsingという型レベル用ライブラリがあるようだけれど、せっかくなのでブール型や自然数型も含めて自作してみることに。type-level FizzBuzz — Gist 参考にさせていただいたページ:型レベル FizzBuzz - eagletmtの日記 - haskell型レベルプログラミング in Scala(Type-Level Programming in Scala) — Japanese translation of Apocalisp v1.0 documentation 気になったことScalaの型レベル計算は評価を正格に行なってしまうので、Ifのような特殊形式が書けないように思う。 //動か
Common Lisp | 14:16 | Final Shift for Call/cc: Direct Implementation of Shift and Resetをちょびちょび読んでいたんですが、Benchmarksのところでreifyとreflectという何やら謎のオペレータが登場。これってどこかで見たなと思ったら、Scalaの限定継続の論文に出てきたやつでした。限定継続を使えばこのreifyとreflectというオペレータが実装できるらしく、モナドを使ったプログラミングが可能になるらしい。試しにCommon Lispのcl-contでreifyとreflectを作ってMonadicなプログラミングに挑戦してみました。 reify/reflectまずpackageを作ります。 (ql:quickload :cl-cont) (ql:quickload :alexandria)
F#, GP, Machine Learning | 20:57 | 最近、機械学習について勉強中です。ところで、遺伝的アルゴリズムを発展させた遺伝的プログラミングというものをご存知でしょうか。通常の遺伝的アルゴリズムでは、遺伝子型を表現するのに数値の配列を使います。ところが配列の代わりに木構造を使うようにすると、構造を持つデータの探索ができるようになります*1。遺伝的プログラミングとは、プログラムの構文木を遺伝子型として用いることで、プログラムの作成そのものを遺伝的アルゴリズムに自動的にやらせてしまおうという技法のことです。遺伝的プログラミング - WikipediaまたF#にはコード引用符という機能があるんですが、これを使うとプログラムの構文木を操作して別のプログラムを生成する、みたいなことが簡単にできます*2。この機能を使えば遺伝的プログラミングが実装できそうだったので、試しにやって
R | 10:01 | どうやらRの内部ではS式っぽいものが使われているようです。 > ast quote(1 + 2) > ast[[1]] `+` > ast[[2]] [1] 1 > ast[[3]] [1] 2 R本体のソースを見てみたら普通にSEXPとかいう名前の構造体(へのポインタ)が使われてるし、他にもCARとかCDRって名前のマクロが使われていたりして、なんというか、Lispっぽさを意識してるんだなぁという感じ。で、このS式っぽいものをコネコネすることで動的にコードを生成したり書き換えたりできるようです。下らない例なんですが、コード中のマイナスをプラスに置き換えてから実行する関数です。 simplecodewalker function(expr, old, new) { as.call( lapply(as.list(expr), function(x) { if (x=
Ruby | 21:40 | Schemeではfluid-letというマクロで動的スコープをエミュレートしているらしい。メカニズムが気になったのでソースを見てみたらかなり単純なものだった。これならマクロじゃなくてevalでもできるなと思ったので試しにRuby版を書いてみることに。 def fluid_let(binds, env=TOPLEVEL_BINDING) olds = binds.keys.map{|var| eval(var.id2name, env)} binds.each{|var,val| eval("#{var.id2name} = #{val}", env) } result = yield ensure binds.keys.zip(olds).each{|var,old| eval("#{var.id2name} = #{old}", env) } result
Clojure | 18:34 | Clojureのマルチメソッドを使っていると、自分で定義した型でディスパッチしたいと思うことがある。しかしdefstructを使ってもうまくいかない。 user> (defstruct Foo :a :b) #'user/Foo user> (struct Foo 1 2) {:a 1, :b 2} user> (class *1) clojure.lang.PersistentStructMap user> (defmulti my-println class) #'user/my-println user> (defmethod my-println Foo [foo] (println "foo")) # user> (my-println (struct Foo 1 2)) ;=> error ; Evaluation aborted. defs
Common Lisp | 15:47 | 以前この記事を読んで、S式でC言語を書くというアイデアは面白そうだなと思っていた。どうやらgauche.cgenというモジュールを使うとciseが使えるらしいのだが、使い方がよく解らないので使うのは諦めていた。他に何か無いかと探していると、タイトルに「S式ベースC言語」という言葉が含まれている論文がCiNiiにあって(これとこれ)この論文を書かれた方のHPに行ってみると、実際に使えるSC言語の実装が公開されていた。こちらにはちゃんとドキュメントもある。このSCを使うと、CL風のマクロがC言語で使える。試しに使ってみた例。 (decl (printf) (fn int (ptr (const char)) va-arg)) (%defmacro from-to (var from to &body form) `(for ((def ,var in
Common Lisp | 23:52 | ClojureやScalaなどの最近の言語は、並行処理が公式にサポートされているのでうらやましい。一方Common Lispの仕様では並行処理はサポートされていないけれど、ほとんどの処理系でスレッドが実装してあるので使いたいならそれを使えばいい。しかしSTMやActorがもてはやされている現在、スレッドなんかでちまちまやるのは非常に煩わしい。そういうわけで、Common Lispでもっと快適に並行処理するためにClikiのライブラリをちょっと漁ってみた。 Clikiのconcurrencyの項目にはいくつか候補があるのだけれど、この中では、個人的にはcl-muprocを使うのがいいんじゃないかと思っている。何より素晴らしいのが、cl-muprocにはちゃんとしたドキュメントがあるということだ(笑)。CL-MUPROC — Erlang-inspi
このページを最初にブックマークしてみませんか?
『d.hatena.ne.jp』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く