コード

gistに書けば良かったかも。

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 '()) …

mirahを使ってみる

mirah=javaのspeed+rubyの文法 のような言語です。 rubyっぽい記述を翻訳して.classに落とし込むようなトランスレータのようなものみたいです。 C#っぽい見た目のファイルをC+glibの形に翻訳するvalaに近い感じですね。 install BuildingMirahがとても参考に…

anything-occurなどで現在のselectionの位置を表示する。

上下に移動する際に、persistent-actionを実行して上げればできそうです。(type-attributeがlineなら) 今回は、 anything-bm-list* anything-occur* を作ってみました。 code

grubのメニューリストをコンパクトにする。

まだ途中。 /etc/default/grub diff --git a/grub b/grub index a5c4c53..eda140c 100644 --- a/grub +++ b/grub @@ -21,7 +21,7 @@ GRUB_CMDLINE_LINUX="" #GRUB_DISABLE_LINUX_UUID=true # Uncomment to disable generation of recovery mode menu entries…

time_tをめぐる冒険?

time_tが何にtypeされているか知りたい。 こんなファイルを作成して foo.c #include <time.h> time_t x; gcc -Eでマクロを展開する。 gcc -E foo.c | grep typedef | grep time_tlong intでした。 typedef long int __time_t; typedef __time_t time_t;</time.h>

clojureの再帰とスタックオーバーフロー(remove-first)

たまたまcljureのMLを見ていた時に、nickiktさんという人が 「"scheme-remove-first"という関数を 書いたのだけれど、自分の実装ではstack overflowしてしまうので気に入らない。 誰かだれかもっと良いバージョンを書いてみてくれ https://groups.google.com…

久しぶりの更新。treeコマンドを作った。

はじまり 何だか最近は更新も滞って何も書いていませんでした。 たまたま、clojureでtreeコマンドを実装しているのをみて作ってみました。treeコマンドをsequenceだけを使って実装できそうな気がしたのです。 例えば、1,2,3…という数列を作る時には、iterate…

123-45-67+89=100

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

lazy-sequenceって重要ですね><

http://d.hatena.ne.jp/kencoba/20100405/1270433351 速度が全然違う>< (defn move [a b] ['move a 'to b]) (defn hanoi [a b c n] (if (< n 1) nil (if (= n 1) (list (move a c)) (concat (hanoi a c b (- n 1)) (cons (move a c) (hanoi b a c (- n 1))…

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

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

clojureでテスト

clojure.testを使ってテストを書いてみる。テストの書き方には2つ方法がある。 defnでの関数定義と一緒にテストを書く deftestで個別にテストを書く テスト書く->(run-tests)という感じで大丈夫 簡単な例 (use 'clojure.test) ;;metaに:testを定義することも…

googleAPIから天気を取得2

http://d.hatena.ne.jp/trotr/20100328 昨日のは無駄な再実装をしていた。 zip-filterあたりを使えば良かったようです。t (require '[clojure.zip :as z]) (require '[clojure.contrib.zip-filter :as zf]) (require '[clojure.contrib.zip-filter.xml :as z…

googleAPIから天気の取得

clojure.xmlのparseにhtmlの文字列を渡せば{:tag :attrs :content)の木として取り出せる。 これをlazy-sequenceにしてfilterをかけていって取り出せばいいのかな? たぶんだけどxpathのようなものが使えるライブラリがどこかにあるはず。どこにあるんだろう…

ふざけてましたすいません。

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)…

.emacsの設定に役立つ関数

.emacsの中で定義していて便利だなと感じる関数/マクロの紹介。 とりあえず、aifとand-let*はUtilityとして必要かなと思います。 他にon-offを切り替えるトグルスイッチ見たいな関数を楽に定義できるdef-toggleというものを定義して使っています。 utilitie…

カーソルの色を変えるelisp

何だか面白そうだったので http://d.hatena.ne.jp/kitokitoki/20100322/p3 http://d.hatena.ne.jp/hitode909/20100322/1269232929 違い emacs上で名前がつけられている全ての色からランダムで選ぶようにした run-with-idle-timerを使ってみた*1 blink-modeと…

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を立ち上げてそれにアクセスするという形にすれば起動は一回で済みそうです。 まだまだ改…

project-euler1〜20

clojureで書くことに慣れるために簡単な問題を解いてみる。 my.math.prime 自分用の個人的なライブラリはどのあたりに置くのが良いのだろう(今は~/mylib/clojure以下に置いている) (ns my.math.prime (:use clojure.contrib.math)) (defn prime? [n] (let [s…

雑にだけれどtransient+persistent!の評価

すごく簡単な初期化のような処理じゃない限りそこまで速度に差はない。 (let [xs (range 1 1000)] (time (dotimes [i 1000] (reduce conj [] xs))) (time (dotimes [i 1000] (persistent! (reduce conj! (transient []) xs))))) ;; ; => ;; "Elapsed time: 1…

1ファイルだけのcall-graph

そのファイルで定義された関数だけ見る。let-fnやletの中で定義された関数は無視。 (use '[clojure.contrib.duck-streams :only (reader writer with-out-writer)]) (use '[clojure.contrib.str-utils :only (re-gsub)]) (defn read-sexps "Like read-lines …

一気に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 …