scheme

listを一連の流れの連鎖ではなく候補からの選択と捉えてみると…

listを一連の流れの連鎖ではなく候補からの選択と捉えてみると、別な形のマクロが思い浮かぶ。 (やり過ぎ良くない…ただ、実験ということで) 例えば、こんな感じ。clojureの->,->>にならい、初期値を取りそれをもとに選択を行うようになっている。 (define (f…

clojureのカスケードマクロを導入

昨日書いていたコードの中でassoce-default相当の関数を書こうとした際に、 clojureの-?>が使いたくなった。-?>は結果をみて偽なら実行を途中で打ち切るという点ではand-let*と同様、 でもand-let*とは異なり結果に特に名前をつけたくないような場合に使いた…

自分勝手なgoshコマンドの作成

個人用のスクリプトを書く際には、便利なライブラリが全てuseされていると嬉しい。 (gauche.experimental.*は、これをuseするのが億劫になり使わないことが度々) 今までは逐一利用したいライブラリをuseしてきたけれど…面倒くさい。 特に他人と共有しようと…

re:schemeで全dataを+するのを知りたいです

こんな感じかな? http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1347295398 http://d.hatena.ne.jp/yad-EL/20100921/p1 (define (mysum xs) (fold (lambda (x acc) (+ (if (list? x) (mysum x) x) acc)) 0 xs)) ;; (mysum 20) ;; (mysum '()) …

123-45-67+89=100

http://d.hatena.ne.jp/fortran66/20100502/1272731623 を見て面白そうだったのでやってみました。 方法は単純でルールの中で存在する可能性のある全ての式を作ってそれをevalするというもの。 Rule 問題は、1 2 3 4 5 6 7 8 9 のどこかに数学記号…

そういえばOnLispに!ってマクロありましたね。

schemeだとfuncallが要らなくなるので綺麗になると書かれていたけれど…使い道が思いつかない。 (define-module onlisp-macros (use srfi-1) ;filter (module-exports !)) (select-module onlisp-macros) (define *!-table* (make-hash-table)) (define-macro…

ANSI Common Lisp入門? lispの世界へようこそ 練習問題3

carとcdrを使って、リストの4番目の要素を返す関数を定義せよ。 4を渡したときにcarとcdrを使って、リストの4番目の要素を返す関数を返す関数を定義すればいいのかなー? これは上の2つより簡単そうですね。 (define (repeat$ n f) (apply compose (make-lis…

ANSI Common Lisp入門? lispの世界へようこそ 練習問題2

(a b c)を返すcons式を3通り示せ。 これは(a b c)を渡したときに(a b c)を返す3通りのcons式を返す関数を定義しろという問題ですね。分かります>< (use util.match) (define (cons: x y) `(cons ,x ,y)) (define (f xs) (match xs [() '()] [(x . xr) (con…

ANSI Common Lisp入門? lispの世界へようこそ 練習問題1

http://d.hatena.ne.jp/sDaigo/comment?date=20100325#c lisp難しいです><。分からないのでschemeで回答します。 以下の式が評価された時何が起こるか説明せよ (+ (- 5 1) (+ 3 7)) (list 1 (+ 2 3)) (if (listp 1) (+ 1 2) (+ 3 4)) (list (and (listp 3)…

pythonのrangeをschemeで

http://d.hatena.ne.jp/jdg/20100323/1269346849 どうしてたくさんのerror処理が入っているのかよく分からないのですが、単純にpythonのrangeをschemeに直すとこのような感じになるのではないでしょうか? (define (step$ n) (lambda (x) (+ n x))) (define …

結構かんたんにtraceって書けるものなんだなー

(use gauche.parameter) (define *depth* (make-parameter 0)) (define *origin-fun* (make-parameter #f)) (define-macro (trace f) `(begin (*origin-fun* ,f) (set! ,f (lambda args (let* ((d (*depth*)) (padding (make-string d #\space))) (print pad…

repl-serverを立ち上げてclojureの起動時間を短縮

はじめに clojure,scala,jrubyとかjvmの上に乗った言語は起動がとても遅い。*1 そんなわけで、これをどうにかしたいと思っていたのでした。 emacsclientのようにserverを立ち上げてそれにアクセスするという形にすれば起動は一回で済みそうです。 まだまだ改…

一気にuse

こんなの便利かな-。 (define-macro (use* prefix args) `(begin ,@(map (lambda (x) (let1 xs (map symbol->string (list prefix x)) `(use ,(string->symbol (string-join xs "."))))) args))) (use* binary (io pack)) ;;(begin (use binary.io) ;; (use …

新たな変数名の作成

http://d.hatena.ne.jp/yagiey/20100305/1267761841 手元にプログラミングgaucheがないので不確かなことを言っているかもしませんが、新たな変数名の作成というのは、渡された引数をマクロの中で変換して創り出した新しいsymbolを利用した手続きや変数の定義…

気づかなかった手続きlist-tabulate(srfi-1)

連番的なリストを生成をする時、iotaとsrfi-42の手続きだけしか使っていなかった。 今までずっとlist-ec以外にiotaで表せない順序だったリストを生成する方法がないというのは変だと思っていたのだけれど。今日たまたまlist-tabulateを発見した。 (use srfi-…

schemeで多変数関数

http://d.hatena.ne.jp/yatsuta/20100211 高階関数についての内容のようです。この日記に書かれた方法は、キーワード引数の原形のような気がしました。 数学が苦手なので、日記中のf+gがどうして5つの引数を取る関数になるのかよくわからないですが、 gauche…

逆引きruby(文字列)をscheme(gauche)で2

コメントをもらったので、その情報を元に追加します。 全体的にsrfi-13の手続きを把握しきれていなかったみたいです。 そして#`"..."を不完全な文字列と勘違いしていました(本当は文字列補間の構文) 文字列中の式を評価し値を展開する(勘違い) #~""は不完全…

逆引きruby(文字列)をscheme(gauche)で

gaucheで文字列を使う場合、クラスを使用します。だからと言って、主に利用するのがクラスのメソッドというわけはありません。 文字列を結合する 文字列を更新する手続きは基本的には用意されていません。文字列を結合する場合には、結合した文字列を新たに…

string-succ(次の文字列)が意外と難しい。

逆引きrubyの "次"の文字列を取得するを取得するというサンプルのString#succと同じ結果を返す手続きが意外と難しい。書いているうちにぐちゃぐちゃになってしまった。たぶん、もっと綺麗に書ける気がする。 だいたいの仕様 文字列を受け取って、 数字の場合…

bowling scoreler

計算部分だけ。golferではないのでそんなに短くない。 haskellなどにあるasパターンを使う方法はないのかな? せっかく、matchを使っているのにも関わらずcdrとかcddrとやっているのは不思議な感じがする。 xs@(y . z .rest)とするとsymbolの解析もしなけれ…

sxml->xml(改行を上手く入れられない)

いまごろなんだけど http://www.thinkit.co.jp/article/74/2/2.html 最近頭が上手く働かない。 (use util.match) (use text.tree) (define *url* '(html (head (title "Gauche Web")) (body (h1 "Gauche Web Page") (a (@ (url "foo.ne.jp")) "link") (table…

迷路

queueのはずがqueue-pop!、queue-push!を使っていて失敗。 いつの間にかdfsになっていた。 確かに問題があらかじめ解っていたら30分くらいで書けるのかもしれない。 「使い慣れた言語があること」を評価基準にしているのかもしれない。 おもしろいと思ったこ…

どう書く.orgの問題(親子のペアからツリーを構築)

http://ja.doukaku.org/178/ hash-tableを使うととても簡単に書ける。 親を探すコストの低い方法はないのかな? (use srfi-1) (use util.match) (define pair-lst '((a b) (b c) (c d) (c e) (a f) (d x) (y z) (z c))) (define (alist->tree alist) (let1 h…

Anarchy Golf

http://d.hatena.ne.jp/knight_5/20100103を見てやってみようと思った。 1 (print "hello world") 2 (copy-port (current-input-port) (current-output-port)) 3 (define (f x y) (let1 b (if (= x 1) "" "es") (print #`",x shinichiro,b of hamaji on the …

gauche0.9rc2がでてた

インストールしてみる。 とりあえずビルド。 wget http://practical-scheme.net/vault/Gauche-0.9_rc2.tgz tar zxvf Gauche-0.9_rc2.tgz cd Gauche-0.9_rc2 gauche-config --reconfigure | sh make テスト make test cat test.record # Total: 9994 tests, 9…

メモ化マクロを作ってみた(tarai)

e.g. ;;メモ化マクロ(define-memoize)を利用 (define-memoize (tarai (x 'eqv?) (y 'eqv?) (z 'eqv?)) (if (<= x y) y (tarai (tarai (1- x) y z) (tarai (1- y) z x) (tarai (1- z) x y)))) ;;普通の定義 (define (tarai2 x y z) (if (<= x y) y (tarai2 (t…

gaucheでterminalに色のついた文字を出力する

ansi-colorを利用した色のついた文字列を作成するライブラリを書いてみました。 e.g. (add-load-path ".") (use ansi-color) (ansi-color-list) (let1 rc (ansi-color 'red) (print "foo" (rc "foo") "bar" (rc "bar"))) (use text.tree) (print (tree->stri…

並列時の実行順序の組み合わせの数

久しぶりに,sicpを読んでみた。 (x y z) (a b c)で20通りなのはほんとなのかな? (use srfi-1) (define (f s1 s2) (cond ((and (null? s1) (null? s2)) '()) ((null? s1) (cons (car s2) (f s1 (cdr s2)))) ((null? s2) (cons (car s1) (f (cdr s1) s2))) (e…

gaucheの補完をanythingから使えるようにしてみた

symbol名の補完 inferior-gauche-modeでは以下の点が不満でした。 scheme-other-window*1で立ち上がったreplとも通信できない anythingで候補を選択できない*2 inferior-gauche-modeではcompleting-readを利用して候補を選択する replと通信する scheme-othe…

@itのgaucheの連載を読んだ

GaucheでRDBプログラミング Gaucheでテンプレートエンジンを作る 継続を使ったコントローラを作る を読んだ。おもしろかった。 A+Bのところをcall/ccを使うとどうなるんだろう? (define (add/cc-maker message) (let ((info (cut print <> message)) (cont …