プログラミング

「What Is Functional Programming? に対する反論」を読んで考えたこと

lyrical-logical.hatenablog.com読んでいて引っかかった部分について考えました。 mutable変数は「入力とは呼べない」? この記事で僕が伝えたいのは、君が書くあらゆる関数には二組の入力と二組の出力があるってことだ。 間違いなく、InboxQueue の状態はこ…

プログラムを哲学する 2. 「概念記法」

以前、言語の完全性について言及した。今回は引き続き、言語の完全性について考える。mandel59.hateblo.jp フレーゲの「概念記法」 フレーゲは未定義の式の存在を「言語の不完全性」(einer Unvollkommenheit der Sprache)とみなしていた。論理学者のフレー…

文脈付き構成的意味論を構成的意味論に変換する

mandel59.hateblo.jpここでは自然数の集合 は0を含むこととする。また、記法 の類は が 以上 未満の区間の整数を動くことを表す。 の時は空の区間を表す。 形式言語 形式言語 は関手集合 , 関手の項数 からなる組である。 式 形式言語 の式集合 をつぎの帰納…

プログラム意味論の分かりやすい紹介

巷に膾炙しているプログラム意味論の説明は、正直言って何を言っているのか、部外者にはよく分からないように感じられる。プログラムの意味を論じる「プログラム意味論」の意味がよくわからないというのは本末転倒だろう。ここでは、プログラム意味論を分か…

プログラミングと哲学

プログラミングと哲学の間には深い関係がある。プログラミングが昔ながらの哲学と単純に対応するというわけではないけれども、だからといって全くの無関係というわけでもない。その理由として、プログラミングの方法論のひとつに、世界を分析し、それを記述…

Referential Transparencyの代わりに使える概念案

Referential Transparencyという概念が指すものは漠然としているので、もっと意味が明瞭で使いやすい用語を定義し、色々な言語の性質を記述してみる。前提として 式は原子式か複合式である。 複合式は関手(functor)と項(argument)から構成される。 〈純…

Referential Transparencyについて取り急ぎ

Wikipedia日本語版に 参照透過性(さんしょうとうかせい、英: Referential transparency)は、計算機言語の概念の一種で、文脈によらず式の値はその構成要素(例えば変数や関数)によってのみ定まるということを言う。 https://ja.wikipedia.org/w/index.php…

プログラミングにおける〈式〉の考察 まとめ

mandel59.hateblo.jp mandel59.hateblo.jp

RustでFizzBuzz まとめ

Rust 0.1 (2012-01-26) プログラミング言語 Rust - M59の記録 Rust 0.4 (2012-11-16) Rust 0.4 - Ryusei’s Notes (a.k.a. M59のブログ) Rust 0.7 (2013-07-06) Rust 0.7 - Ryusei’s Notes (a.k.a. M59のブログ) Rust 0.9 (2014-01-15) Rust 0.9 - Ryusei’s N…

Rust StableでFizzBuzz

前回: RustでFizzBuzz - Ryusei’s Notes (a.k.a. M59のブログ)安定版がリリースされてからは特段試してなかったことに気づいたので、今更ながら安定版で動くFizzBuzzを載せておく。 fn main() { use std::thread::spawn; use std::sync::mpsc::channel; use …

プログラミング言語は自然言語と本質から異なるのか

わたしは小説家になる以前、8年間ほどプログラマーとして働いていまして、こういう思考を始めると止まらないところがあります。コンピューター言語と小説の言語、自然言語は違うのか、という質問はよくされるのですが、これは本質的に異なります。プログラミ…

〈式〉の考察 2

その1 ⇒ プログラミングにおける〈式〉についての考察 - Ryusei’s Notes (a.k.a. M59のブログ)前回、式の望ましい性質として確定性・構成性・純粋性があるという話をした。これらの性質がなぜ望ましいのかを、実際に式を分析しながら詳しく見ていく。 式の構…

プログラミングにおける〈式〉についての考察

「プログラムとは何か」という質問に対する、最も素朴な回答は「プログラムとは、機械に与える命令文の並びのことです」というものだ。命令文を解釈する機械が、プログラムに記された命令に従って、装置を制御し、計算処理を実行する。このようなことは、情…

Everybody Loves Somebody

述語論理に限定継続を追加して、everybodyやsomebodyを表す項を作ってみる。以下、 はそれぞれ shift0, reset0 とする。同時に複数使うと、引数を右から評価するか左から評価するかで継続が異なるため、結果が一意にならず、英語の表現と同様に曖昧になる。…

RDFa Liteのここが酷い

RDFa LiteはRDFa Coreのサブセットで、とても短い仕様なのだけれども、一点気に入らない。なぜ、@aboutではなく@resourceを採用したのか。RDFa 1.1 Primerによれば、@aboutと@resourceの違いは、同じ要素に@propertyが設定されている場合の意味の差だけだ。…

schema.org/URLってダメ

(Poor schema.org/URL - Ryusei’s Notes (a.k.a. M59のブログ)の雑な日本語訳。というか、原文が雑な英語すぎるし、まとまってない。)schema.org/URL というデータ型が定義されているんだけど、これって酷いよね。「この属性のデータ型って何?」「URL。」…

Poor schema.org/URL

schema.org/URL is one of data types defined for linked data. I hate it, because it is totally useless. “Hey, what is the data type of this attribute?” “URL.” That is nonsense.An URL is just an identifier. That is URL, I know. Almost every …

ソースコードは基本設計図か

www.nikkei.com用語ミニ解説として、オープンソースが「基本設計図である「ソースコード」が公に開示されているソフト」と解説されているのだけれども、ソースコードは基本設計図なのだろうか。基本設計図というのは建築における用語だ。建築では、設計図に…

関数とラムダ計算の話

高階関数と関数オブジェクトとラムダについての自分なりのメモ書き - Line 1: Error: Invalid Blog('by Esehara' )bugrammer.hateblo.jpこの記事へのツッコミみたいなことを書くつもりだったけど、あんまり関係ない話になったので、サイドストーリーみたいに…

アクションと関数、式の値の話

プログラムにおける「関数」とは何かについて、自分なりのまとめ - Line 1: Error: Invalid Blog('by Esehara' )bugrammer.hateblo.jp a -> bというのは、引数にa型の値をとり、b型の値を返す関数の型だ。 Monad mが存在するような任意の型コンストラクタmに…

ES6のジェネレータはHaskellのdo記法ほど強力ではないという話

Monads in JavaScriptcuriosity-driven.org JavaScriptのモナド | プログラミング | POSTDpostd.ccこの記事では、ES6のジェネレータを使って、Haskellのdo記法を模倣したdoM関数を定義し、ジェネレータを使ってモナドを取り扱えることを示している。しかし “…

CoffeeScriptで代数的データを表現する

関数型言語ではポピュラーな機能である、代数的データ型を愛してやまない人は多いだろう。しかし悲しいことに、CoffeeScriptは、代数的データ型を持っていない。今回は、オブジェクトを使って代数的データの条件分岐を表現する方法について書こうと思う。次…

Debug the Haxe Compiler with OCamlDebug

1. Apply the following patch to the Makefile: diff --git a/Makefile b/Makefile index e912e15..1f6c71f 100644 --- a/Makefile +++ b/Makefile @@ -80,7 +80,7 @@ libs: make -C libs/objsize OCAMLOPT=$(OCAMLOPT) OCAMLC=$(OCAMLC) $(TARGET_FLAG) ha…

プログラムを哲学する 1. 言及

これから書くのは、言葉や論理と、その意味に関する話だ。フレーゲらによる、物事を厳密に考える言葉の探求は、現代論理学や分析哲学の出発点になった。まずは、その哲学を探りながら、関数プログラミングの話でよく耳にする「参照透過性」という概念を理解…

プログラムを哲学する 0. プログラムと哲学の関係

僕は、プログラムを哲学したい。その動機のひとつに、用語の統一がある。現状、プログラムにおいて使われる用語は、対象言語によって色々と異なってしまっている。たとえば、似たような概念に、あるプログラム言語ではポインターという用語を使い、別の言語…

圏論プログラミング言語 CPL

Hagino’s Categorical Programming Language について紹介します。wikipedia:CPL (圏論プログラミング言語)によれば、 CPL (正式名称:Categorical Programming Language) は圏論に基づいたデータ型の定義と計算モデルを持つ関数型プログラミング言語であり…

Tao3Dでインタラクティブな3Dアニメーションをつくろう (1) 使い方の基本

Tao3Dは、インタラクティブなスライドやアニメーションが作成できるプログラミング言語および開発プラットフォーム。Windows版, OS X版, Linux版のパッケージが用意されている。Tao3D Libre EditionはGPLv3でライセンスされている*1。Tao3Dを起動すると、Wel…

こわくない Idris (6) 補足

こわくない Idris (6) - M59のブログ こわくない Idris (6) - M59のブログ 1年前に書いた記事を読み返していたら、証明がすぐには理解できなかった。証明の内容を言葉で分かるように書いておきたいと思う。次のコードのMyHead.headは、全域函数だ。 %default…

書き難き我が意を得たるプログラム

を読んで、思ったことを書く。「プログラムは思った通りに動かない。書いた通りに動く。」いったい誰が言ったのかは分からないこの箴言だが、ただ当たり前のことを言っただけでは箴言にはならなくて、ここには意外性がある。つまり、この箴言に出会う前の人…

C++にdo記法入れる話

本の虫: 2014-05-pre-Rapperswil mailingのレビュー N4015でHaskellのdo記法風っぽいdo式を入れる提案があるわけなのだけれども、そもそも手続き型の記法でプログラミングができるC++の上にさらにモナドを使って手続き型風記法でプログラミングするためのdo…

酷い翻訳

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"; trac…

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