Scheme

Petite Chez Schemeをインストール

Chez Scheme Version 8.4 tar -xzvf pcsv8.4-ti3osx.tar.gz cd csv8.4/costom ./configure --installprefix=~/local --installman=~/local/share/man make make install すると petite と scheme-script がインストールされる。root権限にchownしようとした…

はじめてのQuineリレー

概要 昨日、自分自身を出力するHaskellプログラムを生成するOCamlプログラムを生成するSchemeプログラムを生成するRubyプログラムを生成するJavaScriptプログラムを生成するCプログラムを書いた。 #include<stdio.h> int main(){char*g="var p=print;p('puts %%^(form</stdio.h>…

method-missingを作ってみた

勢い余って「適用できるメソッドがなければ method-missing を呼び出す」機能を作ってみた. (define-generic method-missing) (define-class <method-missing-generic> (<generic>) ()) (define-method apply-methods ((gf <method-missing-generic>) methods args) (if (null? methods) (apply method-missing gf arg</method-missing-generic></generic></method-missing-generic>…

Hello, polyglot!

きっかけ: るびま これを読んでpolyglotするかーって思った. 今回のコンセプトは 初めてなのでやさしくHello, world! 好きな言語を盛り込む 140文字以下 以下,Schemeと言いつつGauche決め打ちである. ソースコード できあがったのがこれ. ;(#)={-"^<"v '…

Racketの継続プリミティヴ

Racketの継続がどうなっているのか,Racketのドキュメントを読みつつ分かったことをまとめる. (注意: この記事は継続の解説ではない.寧ろ継続自体は大体分かっている前提で進める) まず,主な継続プリミティヴについて簡単に説明する.次に,組み合わせた…

MIT/GNU Scheme 9.1.1

MIT/GNU Scheme - GNU Project - Free Software Foundation 今回は無気力なのとなんかいろいろあってよく分からないのでバイナリを入れた."Compiled on OS X 10.6" だし.x86-64のをダウンロードしてコピーして終わり. かと思いきやパスにコロンが入ってて…

c-wrapperのインストール

c-wrapper,c-wrapper は更新されていないけど http://hg.koguro.net/c-wrapper で更新されていた.ダウンロード→タグからダウンロードできる. ./DIST gen ./configure CC=/usr/bin/gcc make DYLD_INSERT_LIBRARIES=/usr/lib/libffi.dylib make check普通に…

パターンガードとGaucheのutil.match

最近のHaskellにはパターンガードというものがあるらしい. {-# LANGUAGE PatternGuards #-} addLookup alist x y | Just m <- lookup x alist , Just n <- lookup y alist = m + n | otherwise = 0 main = print $ addLookup [(1, 2), (3, 4)] 1 3 -- => 6 …

動的環境を指定してthunkを呼ぶ

shift/reset と動的環境の関係についていろいろ考えていた時に出てきた副産物. (use util.match) (define (capture/de proc) (match (let/cc de (list (proc de))) ((r) r) (thunk (thunk)))) (define (with/de de thunk) (let/cc cont (de (.$ cont thunk)…

make-syntactic-closure の練習

(define-syntax alet1 (sc-macro-transformer (lambda (expr use-env) (let ((it-expr (cadr expr)) (var (caddr expr)) (expr1 (cadddr expr)) (body (car (cddddr expr)))) `(let ((it ,(make-syntactic-closure use-env '() it-expr)) (,var ,(make-synta…

make-syntactic-closure の free-names のイメージ

(make-syntactic-closure environment free-names form) の free-names は,let で包むイメージでいいんだろうか. (let ((x 1)) (let-syntax ((foo (sc-macro-transformer (lambda (expr env) (let ((var (cadr expr))) (make-syntactic-closure var (list …

のゼロ元オブジェクトを作ってみた

(use gauche.collection) (use gauche.mop.singleton) (define-class <zero-collection-meta> (<singleton-meta>) ()) (define-class <zero-collection> (<collection>) () :metaclass <zero-collection-meta>) (define-method call-with-iterator ((class <zero-collection>) proc :key start) (proc (^ () #t) (^ () (err…</zero-collection></zero-collection-meta></collection></zero-collection></singleton-meta></zero-collection-meta>

R5RSの数値リテラルっぽいものをGaucheのparser.pegでパーズした(2)

前回から虚部の i の代わりに!も使えるようになったのとr進数(r>1)が使えるようになった.あと $try が足りない所があったので足したり.最早,R5RSの数値リテラルっぽいものではなくなってきている. 前回の36進数の虚部が汚いという問題.コメントも頂いた…

R5RSの数値リテラルっぽいものをGaucheのparser.pegでパーズした

R5RSの数値リテラルのサブセットを拡張したもののパーザをparser.pegで書いた.具体的には小文字しか使えないのと 123### を削って小数を10進以外でも書けるようにした感じ.あと36進数と指数マーカに^を追加. parser.pegはundocumentedでよく分からないの…

Scheme golf tips

あなごる用 Haskell golf の教科書を読んで「俺もこういうの書きたい!」と思って書いてみた.(思ってから書くまでに1年くらい経ってるけど) アマチュアゴルファーなので至らぬ所もありありだけど,今後のScheme界とあなごる界の盛り上がりを願ってこの文章…

Gaucheで素数ストリーム

エラトステネスの篩 (define (divisor? x y) (eqv? 0 (remainder x y))) (define-constant +primes+ (stream-cons 2 (stream-filter prime? (stream-iota -1 3 2)))) ;; (define (prime? n) ;; (not (stream-any (cut divisor? n <>) (stream-take-while (cu…

「F#をまねる」をまねる

F# の |> 演算子がかっこよいので、Haskell で作ってみた。 infixl 0 |> (|>) :: a -> (a -> b) -> b a |> f = f a 以下のようにシェルのパイプのような感じで使う。 foo :: String foo = [1..100] |> map (*2) |> filter (\x -> x `mod` 6 == 0) |> sum |> …

(rnrs records syntactic)とsrfi-17の一般化されたset!

(rnrs records syntactic)とsrfi-17を組み合わせて使いたかったんだけど,どうも手動でsetterをset!しなければならないようだったので,マクロの勉強ついでにsetterをset!してくれるものを書いた. 最初は手続きで書いてdefine-record-typeの後に置くような…

Racket(PLT Scheme)をインストール

日が経っているのでうろ覚え. サイトからMac OS向けっぽいのをダウンロード 展開して/Applications/にぶち込む "/Applications/Racket v5.0.2/bin"にPATHを通す これでplt-r6rsでR6RSが動く.ただ,これだと"/Applications/Racket v5.0.2/man"とかガン無視…

GaucheでHaskellのscanl

Haskellのscanlに相当するものがなかったので書いた. (修正 9:24) (use gauche.collection) (define (scan-with-iterator+builder f seed end? next add! get) (let loop ((seed seed)) (add! seed) (if (end?) (get) (loop (f (next) seed))))) (define-me…

tree-mapの比較関数のデフォルト値

gosh> (coerce-to <tree-map> '(("a" . 1) ("b" . 2))) WARNING: unknown keyword :size *** ERROR: real number required: "a" これは=と ついでに変な警告出てる.</tree-map>

srfi-18とsrfi-34のraise

(call/cc (lambda (k) (with-exception-handler (lambda (x) (print "condition: ") (print x) (k 'exception)) (lambda () (with-exception-handler (lambda (x) (raise (list 'foo x))) (lambda () (raise 'bar))))))) srfi-18のraiseだと無限ループして,…

dynamic-windマジぱねぇっす

(dynamic-wind (lambda () (print 'before1)) (lambda () (define cont #f) (print 1) (dynamic-wind (lambda () (print 'before2)) (lambda () (print 2) (set! cont (call/cc values))) (lambda () (print 'after2))) (dynamic-wind (lambda () (print 'be…

foldのcallbackの引数の順序

絶対おかしいと思うんだけどどうしてこうなっているのか… (fold list 0 '(1 2 3) '(4 5 6)) ; => (3 6 (2 5 (1 4 0))) この仕様の所為で,foldの実装で素直にapplyできないんだけど… 実装が複雑になってもコストは同じなんだろうか. 意味的にも固定数のもの…

BiwaSchemeメモ

JavaScriptで書かれたScheme処理系BiwaSchemeに関するメモ. R6RS準拠を目指している. call/ccが何故か構文 call-with-current-continuationを評価させると#だけどcall/ccだとundefined(でも使える) mapのcallbackの中で作られる継続のextentが(多分)mapに…

delayは要らない子?

Gaucheのような (lazy 3) を許す処理系だと,実はdelayを使う意味ってなかったりする?

scheme-modeのeldoc-modeでEmacsがフリーズする

#/\"\"(|)/ これ書いて最後ら辺で適当にポイント動かしてるとEmacsがフリーズする. 使ってるのはCarbon Emacs. eldoc-mode切ると落ちなくなった.再びeldoc-modeするとやはりフリーズ.

map-acc

こんな感じのsum-accを書きたかったんだけど,なかなか綺麗に書けない. (sum-acc '(1 2 3 4)) ; => (1 3 6 10) 累積和のリストっていうのかな. 累積ってことでgauche.collectionのmap-accumを使ってみる. (use gauche.collection) (define (sum-acc lis) …

Lispにマップリテラルが無かった本当の理由

Common LispやSchemeでハッシュテーブルリテラルが無いのには理由がある。最大の理由は、「ハッシュテーブルを再現するには、各要素だけでなくハッシュ関数および比較関数の情報が必要」という点だろう。 http://blog.practical-scheme.net/shiro/20100219-m…

map-reverseってないのね

Gaucheって,というかSRFI-1ってmap-reverseみたいなのってないのね. OCamlにはrev_mapがあるからそのノリで勝手に当たり前のようにあると思ってたけどそんなことはなかった. append-reverseはあるのに…