プログラミング

酷い翻訳

javac 1.8.0_05を使っていたところ、意味不明なwarningが出た。 Test3a.java:9: 警告: [unchecked] raw型Listのメンバーとしてのadd(E)への無検査呼出しです ln.add(10); ^ Eが型変数の場合: インタフェース Listで宣言されているEはObjectを拡張します原文…

HaxeでUnicode文字列をどう取り扱うか

Haxeには複数のターゲットがあり、文字列のAPIは共通だが、それぞれで文字列の内部表現が異なっている。普通にプログラムを書いても、ターゲットによって結果が変わってくる。 class Main { public static function main() { var s = "\u{20000}𩸽あëa"; tra…

RustにおけるOptionの最適化

ネタ元: performance - What is the overhead of Rust's Option type? - Stack OverflowRustにはnull値がなく、代わりにOptionを使う。このOptionは、ポインタ型に対しては最適化されるそうだ。確認してみる。(rustc 0.10を使った。) use std::mem::size_of;…

Rustのランタイムライブラリー

現状Rustにはランタイムライブラリーが2つ実装されていて、ネイティブスレッドを使うlibnativeとグリーンスレッドを使うlibgreenがある。詳細はA Guide to the Rust Runtimeにある。実際にそれぞれのランタイムライブラリーを使ったFizzBuzzを作って試してみ…

Rust 0.10でFizzBuzz

毎度おなじみFizzBuzzでRustの変更点を確認しよう。 fn main() { let (tx, rx) = channel::<(int, std::str::MaybeOwned<'static>)>(); for i in range(0, 100) { let tx = tx.clone(); spawn(proc() { let i = i + 1; let b = match (i % 3, i % 5) { (0, 0…

RustのSendStr

RustにはEnum std::send_str::SendStrがあって、これは送信可能な文字列型である~strか&'static strのどちらかを保持する。Trait std::send_str::IntoSendStrのメソッド fn into_send_str(self) -> SendStr を使って、それらをSendStrに変換できる。例のFizz…

プログラミング言語の語順

自然言語を主語(S)・目的語(O)・動詞(V)の語順で分類するように、プログラミング言語もオブジェクト(O)・実引数(A)・メソッド(M)の語順で分類できる。(Smalltalk, C++など)よくある語順オブジェクト指向言語風の語順はOMA型だ。一方で、(GObject/C, CLOS/…

Rust 0.9

例のごとくFizzBuzz // for Rust 0.9 fn main() { let (port, chan) = SharedChan::new(); for i in range(0, 100) { let chan = chan.clone(); do spawn { let i = i + 1; let b = match (i % 3, i % 5) { (0, 0) => ~"FizzBuzz", (0, _) => ~"Fizz", (_, 0…

プログラミング言語 Shiba (仮称)

こんなプログラミング言語を考えている。Shiba fact: { @ if ( = 0 ) :x { 1 } { * :x fact ( - 1 ) :x } x: } fact 10 even: { @ if ( = 0 ) :x { true } { odd ( - 1 ) :x } x: } odd: { @ if ( = 0 ) :x { false } { even ( - 1 ) :x } x: } even 42 even…

静的型付けスタックベース関数型プログラミング言語 Kitten

マイナー言語 Advent Calendar 2013 のネタにしました。 Kittenでスタックと戯れる - Qiita [キータ]Kittenって子猫って意味なんだけど、それ以前にCatって言語があったみたいだ。concatenateのcatなのかな。

Haxeのバグ

https://github.com/mandel59/hxcpp/commit/703b0f7129edc72fdead9ff9f034f42cc2ba1ec9 - return ((c & 0x0F) << 18) | ((c2 & 0x7F) << 12) | ((c3 << 6) & 0x7F) | ((*ioPtr++) & 0x7F); + return ((c & 0x0F) << 18) | ((c2 & 0x7F) << 12) | ((c3 & 0x7F…

RedHatからやってきたAltJava/AltJS言語 Ceylon

Ceylon 1.0.0がリリースされました。 米Red Hat、新言語「Ceylon 1.0」発表、初のプロダクションリリースに | SourceForge.JP MagazineRedHadがCeylonって言語を作っていることはどこかで読んで知っていました。でも、JVMをターゲットにした言語だし、ウェブ…

GoとRustの比較

こういうバージョンの処理系で試した。 $ go version go version go1.1.2 linux/amd64 $ rustc --version rustc 0.9-pre (825b127 2013-11-12 18:56:13 -0800) host: x86_64-unknown-linux-gnu// Go package main import ( "fmt" "sort" "strconv" ) type T …

Luaと協調するマルチステージ言語 Terra (3)

C言語後方互換性 TerraはClangの機能を使って、C言語との後方互換性を実現しているので、C言語から使えるライブラリならTerraからも使うことができる。 試しにTcl/TkをTerraから使ってみる。 libtcl = "libtcl8.5.so.0" libtk = "libtk8.5.so.0" includepath…

Luaと協調するマルチステージ言語 Terra (2)

実行時コンパイル LuaからTerraの関数を呼べるし、TerraからLuaの関数を呼べる。 -- hello2.t stdio = terralib.includec("stdio.h") function hello_lua() print("Hello from Lua!") end terra hello_terra() stdio.printf("Hello from Terra!\n") end terr…

Luaと協調するマルチステージ言語 Terra (1)

今年5月ごろに公開されて、Twitterではちょっとは流れてきたのだけれども、日本語の情報が全然流れないままのTerraという言語があって、ちょっと気が向いたのでもう一度調べてみることにした。Terra どんな言語なのか 説明によれば、TerraはLuaと同時に使え…

Cとモナド

Go言語でEitherモナドは無理がありすぎる感じがした。では、他の言語ではどうだろうか? C言語では関数の戻り値でエラーかどうかを判定しなければならないことが多いわけですけど、&&演算子の短絡評価を使えば、簡潔にこのように簡潔に書くことさえ可能だ。 #…

Goとモナド

Goとerror monads - moriyoshiの日記ちょっとそれをモナドって呼んだらHaskellerやってきますよ? (太宰メソッド) こういうふうにやらないとモナドを使ったとは認めません。 package main import ( "log" "os" ) type right struct { val interface{} } typ…

依存型の表現力と逆問題

Idrisみたいに、函数プログラミングを前提にしている言語には函数を合成する演算が標準で用意されているよね。 (.) : (b -> c) -> (a -> b) -> a -> cこの演算子を使うと、函数を合成してくれる。函数の合成を使えば、プログラムを変数を使わないで書くこと…

こわくない Idris (7)

帰納と余帰納 制限された再帰 Idrisには函数が全域函数であるかチェックする機能があるのだけれども、プログラムに制限なく再帰が使われていると、その函数が値を返すのか、それとも停止しないで値が返らないままなのか判定する方法が存在し得ない。そこで、…

こわくない Idris (6)

表明から証明へ (3) headを証明する HaskellのPrelude.headとは異なり、IdrisのPrelude.List.headは、引数にコンスセルである証明をとるので、全域函数になっている。Idrisのシステムでは次のように、%assert_total宣言によって、全域函数であることが「表明…

こわくない Idris (5)

表明から証明へ (2) 型と命題 カリー゠ハワード同型対応により、プログラムと証明が対応すると述べた。実際にはどのように対応しているのだろうか? 実は、恒真である命題は、空でない(その型である値を持つ)型に対応しているのだ。 型と命題の対応関係を見…

こわくない Idris (4)

表明から証明へ 表明とテスト バグの原因のひとつとして、プログラム実行時に守るべき条件が守られていないことが挙げられるだろう。プログラムが一体どのような場合に正常に動作し、どのような場合に望まない結果をもたらすのかが分かっていなければ、バグ…

こわくない Idris (3)

ハロー、依存型プログラミングの世界 (3) 依存ペア 依存ペア dependent pair とは、ある値と、その値に依存した型を持つ値のペアのことだ。 data Exists : (a : Type) -> (P : a -> Type) -> Type where Ex_intro : {P : a -> Type} -> (x : a) -> P x -> Ex…

こわくない Idris (2)

ハロー、依存型プログラミングの世界 (2) データ型の宣言 代数データ型を宣言する場合には、Haskellと同様の記法を使うことができる。HaskellでもおなじみのEitherやListの宣言はidrisではこうなっている。 data Either a b = Left a | Right b data List a …

こわくない Idris (1)

はじめに Idrisという、Haskellに似ていて、依存型 dependent type を持っている言語がある。依存型を持った言語なんて他にもあるのだけれども、Idrisは general purpose を謳っている。わざわざ汎用って謳っているあたり、依存型ってのはもっと色々に使える…

haxe.Utf8の非互換性

次のコードの出力を各プラットフォームで比較する。(現時点のGitHub上にある開発版を使う。) import haxe.Utf8; class Hello { public static function main() { trace("あ𠀀い"); trace("あ𠀀い".length); trace("あ𠀀い".charCodeAt(1)); trace("あ𠀀い".c…

Rust 0.7

前回: Rust 0.4 - M59のブログRust 0.7 向けに書きなおし。 // for Rust 0.7 extern mod extra; use sort = extra::sort::quick_sort; fn main() { let (port, chan) = stream(); let chan = std::comm::SharedChan::new(chan); for std::uint::iterate(0, 1…

Pixilang マニュアル (英語) PixilangV3Manual - pixilang - Simple programming language for small graphics/sound applications and experiments - Google Project Hosting

ピクセル指向プログラミング言語 Pixilang (3)

アニメーション グラフィックスを動かしてみる。 while 1 { t_rotate( 1, 0, 0, 1 ) clear() dot( 0, 0, WHITE ) line( 0, 100, 100, 0, ORANGE ) box( -100, -100, 50, 100, RED ) fbox( 100, -100, 100, 50, #ffeecc ) frame() while get_event() { if EVT…