scheme

たらい回し関数によるGCC、OCaml、Haskellの速度比較

「お気楽 OCaml プログラミング入門」に色んな言語のたらいまわし関数の結果が掲載されていて、OCamlがCよりも速い驚異的な数値を叩き出していました。 Haskell がありませんでしたので比較してみました。 C #include <stdio.h> int tak(int x, int y, int z){ if (x </stdio.h>…

「Write Yourself a Scheme in 48 Hours」 を写経してみる(16) : 基本 IO の作成(2)

Write Yourself a Scheme in 48 Hours/Creating IO Primitives http://jonathan.tang.name/files/scheme_in_48/code/listing10.hs ioPrimitives が追加になって、"apply"など組み込み関数が使えるようになったかと思って実行してみるとエラーになります。 io…

「Write Yourself a Scheme in 48 Hours」 を写経してみる(14) : Scheme関数の定義(3)

48時間でSchemeを書こう/Scheme関数の定義 http://jonathan.tang.name/files/scheme_in_48/code/listing9.hs apply の部分をもう少し追います。 apply は引数 args に引数 Func を適用して、その結果を返すという関数で、そのパターンは二つあります。 (1)最…

「Write Yourself a Scheme in 48 Hours」 を写経してみる(14) : Scheme関数の定義(2)

48時間でSchemeを書こう/Scheme関数の定義 http://jonathan.tang.name/files/scheme_in_48/code/listing9.hs trace を入れて define、その定義された関数の適用される様子を追ってみます。 表示するための定義 instance Show LispVal where show = showVal2 …

「Write Yourself a Scheme in 48 Hours」 を写経してみる(13) : Scheme関数の定義

48時間でSchemeを書こう/Scheme関数の定義 http://jonathan.tang.name/files/scheme_in_48/code/listing9.hs まず、 LispVal型のデータを見ますと二つの型が追加されています。 data LispVal = Atom String | List [LispVal] | DottedList [LispVal] LispVal…

「Write Yourself a Scheme in 48 Hours」 を写経してみる(12) : 「エラーチェックと例外」をもっと

Env の内容が表示出来るようになったところで、 defineVarを動かしてみたいのですが Show インスタンスがないので表示できません。 > env <- nullEnv > showEnv env -- > [] > defineVar env "y" (Number 9) <interactive>:1:0: No instance for (Show (IOThrowsError Lis</interactive>…

「Write Yourself a Scheme in 48 Hours」 を写経してみる(10) : cdr の評価が間違っている。

「Write Yourself a Scheme in 48 Hours」 を写経してみる(6) : 評価その2の中で cdr を評価する部分があったのですけれども、kazu-yamamoto さんの「HaskellでScheme」という記事の中で「cdr の定義が間違っている」記述を見つけました。 cdr [DottedList …

「Write Yourself a Scheme in 48 Hours」 を写経してみる(9) : 変数の追加と割り当て

Write Yourself a Scheme in 48 Hours/Adding Variables and Assignment http://jonathan.tang.name/files/scheme_in_48/code/listing8.hs まず、評価をするeval関数から見ていきます。 eval :: Env -> LispVal -> IOThrowsError LispVal eval env val@(Stri…

「Write Yourself a Scheme in 48 Hours」 を写経してみる(8) : REPLを構築する。

Write Yourself a Scheme in 48 Hours/Building a REPL http://jonathan.tang.name/files/scheme_in_48/code/listing7.hs REPLとは Read-eval-print loopの略。読み込んで評価をしてそれを表示・・・その繰り返しをする対話型評価環境を作ります。 import IO…

「Write Yourself a Scheme in 48 Hours」 を写経してみる(7) : Equal? と弱いタイピング: 不均一なリスト

タイトルが長すぎるのが気になります・・・。 Write Yourself a Scheme in 48 Hours/Evaluation, Part 2 http://jonathan.tang.name/files/scheme_in_48/code/listing6.4.hs まず、ghci listing6.4.hs とするとエラーになります。 $ ghci listing6.4.hs GHCi…

「Write Yourself a Scheme in 48 Hours」 を写経してみる(6) : 評価その2

Write Yourself a Scheme in 48 Hours/Evaluation, Part 2 http://jonathan.tang.name/files/scheme_in_48/code/listing6.3.hs primitives :: [(String, [LispVal] -> ThrowsError LispVal)] primitives = [("+", numericBinop (+)), ("-", numericBinop (-)…

「Write Yourself a Scheme in 48 Hours」 を写経してみる(5) : エラーチェックと例外

Write Yourself a Scheme in 48 Hours/Error Checking and Exceptions http://jonathan.tang.name/files/scheme_in_48/code/listing5.hs -- readExpr は (Right) パースに成功するとパースした値を返す。 -- 失敗のときは (Parser err) の例外を投げる。 rea…

「Write Yourself a Scheme in 48 Hours」 を写経してみる(3)

http://jonathan.tang.name/files/scheme_in_48/code/listing4.3.hs 今回は基本的なS式の評価です。 評価する様子が見えるようにtraceを入れてみました。 内部データが見えるように Show インスタンスをコメントで無効にし、deriving Show を追加しました。 …

「Write Yourself a Scheme in 48 Hours」 を写経してみる(2)

HaskellでLispを書く日記を読んでいたのですけれども、私の能力では Cons のネストを追うのが大変なので、以前に写経した「『Write Yourself a Scheme in 48 Hours』を写経してみる」の続きをやってみます(こっちは出来ない英語なので大変なのですが)。 まず…

「Write Yourself a Scheme in 48 Hours」 を写経してみる。

「Write Yourself a Scheme in 48 Hours」と言うHaskellでSchemeを書くチュートリアルを見つけたので、理解出来るとこまで写経してみます。1.First Steps: Compiling and running 2.Parsing parsec によるパース -- spaces を自分で定義しているので Parsec …

チャーチ数とラムダ計算

検索していたら、きしだのはてな・おとうさん、ぼくにもYコンビネータがわかりましたよ! という記事にめぐり逢って面白かったので Scheme 写経してみました。 ラムダ関数の表記 ラムダ関数は λx.x のように表記します。 λx.x λx.x*2(λx.x*2)y という関数は …

Gauche でパターンマッチ

11.47 util.match - パターンマッチング Haskell でパターンマッチ分岐すると他の言語でもパターンマッチしたくなる。 (use util.match) (define (match-test ls) (match ls (((a b) c (d e)) (list "a:" a b c d e)) (((a b)) (list "b:" a b)) (((a b) c) …

Gauche で Brainf*ck を作ってみた。

「Rubyで作る奇妙なプログラミング言語」を参考に Gauche で Brainf*ck を作ってみました。 使い方は、(この方法だと','による入力が無視される) $ echo "+++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-.------------.<++++++++.------…

Gauche で経路探索A*(エースター)

経路探索アルゴリズムA*(エースター)を参考にGauche で書いてみました。 (use srfi-1) ;; List library (use srfi-43) ;; ベクタライブラリ (use gauche.interactive) (use slib) (require 'trace) (define maze-string (string-append "*******************…

eq? eqv? equal? の使い分け

同値かどうかの判定に q? eqv? equal? のうちどれを使えば良いか分からなかったのでGauche ユーザリファレンス 6.1 等価を参考にテストしてみた。 (define (list-for-each pred dat ls) (call/cc (lambda (return) (for-each (lambda (x) (if (pred x dat) (…

Gauche のハッシュテーブル Ruby のハッシュテーブル

Gauche のハッシュテーブルは Key の 比較を eq?, eqv?, equal?, string=? から選択して指定します。 gosh> (hash-table 'eq? '(a . 1) '(b . 2)) #<hash-table eq? 0x89ff578> gosh> (hash-table-get (hash-table 'eq? '(a . 1) '(b . 2)) 'a) 1 gosh> (hash-table-get (hash-table 'e</hash-table>…

「プログラミングGauche」読書メモ(1)

6.2 リストの基本操作 gosh> '(1 . (2 . (3 . (4 . (5 . ()))))) (1 2 3 4 5) (1 . (2 . (3 . (4 . (5 . ()))))) と (1 2 3 4 5) は同等で、通常はドットをなるべく使わない表記をしている。 で、初心忘るべからずというか、この逆の関数を作ってみた。 (def…

Gaucheでヒープ

練習に「常に子よりも親が大きい(小さい)値の二分木をヒープという」を Gauche で書いてみた。 (use gauche.collection) (use gauche.uvector) (use srfi-43) ;;vector-swap! ;; 親の位置 (define (parent n) (quotient (- n 1) 2)) (define (vct-swap v x…

べクタを使ってみる。

(use gauche.uvector) (define vct (list->vector '("abc" "def" ("hello" 123))) ) (print (vector? vct)) ;;=> #t (print vct) ;;=> #(abc def (hello 123)) (print (vector-ref vct 0)) ;;=> abc (print (vector-ref vct 2)) ;;=> (hello 123) (define vc…

Gauche DBI(Postgresql) の NULL は "" を返す。

Gauche DBI(Postgresql) の NULL は "" を返す。 (use dbi) (use gauche.collection) (define (select-db dbname sql) (guard (e ((<dbi-error> e) (raise e))) (let* ((conn (dbi-connect (string-append "dbi:pg:dbname=" dbname))) (result (dbi-execute (dbi-prepar</dbi-error>…

Gauche で DBI(Postgresql)

まず、Postgresql のドライバを入れる。 $ wget http://www.kahua.org/download/dbi/Gauche-dbd-pg-0.2.1.tgz $ tar zxf Gauche-dbd-pg-0.2.1.tgz $ cd Gauche-dbd-pg-0.2.1 $ ls $ lv README $ which pg_config /usr/bin/pg_config $ rpm -qf /usr/bin/pg_c…

リスト文字列を1文字ずつパース

深さを自由に表現できるリストをパースする まず、どのような動作をすれば良いか書いてみる。 str=%([["A",["B"]],["C","1"]]) 希望する結果 リストをスタックに保存 そのための 結果 しながら管理する様子 命令 [] s0[] s[0]=[] [[]] [[]] s0[] s1[] s[1]=[…

map を自分で定義

もうひとつの Scheme 入門 8. 高階関数 練習問題 6 2. map を自分で定義してみてください。この問題は以前できなかったんだけれども、思い出してやってみると、すごくダサイけれどそれなりに動くのが出来た。 (use srfi-1) (define (mymap f . ls) (if (null…