Lisp

Clojureのシンボル比較

シンボル比較は何よりも速いと期待していると裏切られる。Clojureではシンボルにメタデータをつけられるので等値なシンボルが等価でない。ただキーワードならちゃんと等価になる。 user> (time (dotimes [_ 1000000] (= 'a 'a))) "Elapsed time: 53.835 msec…

古き良きLambdaExpression

lambda式を動的に生成したい場合を考える。 EmacsLispでは lambda式の形をしたリストはそのまま関数として使用可能なので (funcall (list 'lambda '(x) '(+ x 3)) 3) ;=> 6 とすれば良い。 しかしCommonLisp(Cltl2)では a list whose car is lambda is not, …

99 Lisp ProblemsをLOOPマクロのみで解く。

L-99: Ninety-Nine Lisp Problems リスト処理の問題集だそうだ。これをLOOPマクロのみで解いている。P01からP07まで解いた。 使っていい関数は引数のサイズによらずに定数時間で終了する関数のみ。つまり再帰呼び出しや#'EQUALは不可。ただし前にLOOPで書い…

Rの式の構造をS式で表現する関数

ソース:gist:392146 · GitHub Rが如何にLispに似ているかが分かる。 cmd.img <- function(exp, filename) { filename <- paste(filename, ".png", sep="") png(filename) eval(substitute(exp)) dev.off() c(pre(capture.output(substitute(exp))), img(fil…

SBCLでのfunctionの挙動

(defun a () 0) (defvar b (let ((c #'a)) (defun a () 1) c)) (a) ;=> 1 (funcall b) ;=> ??? sbcl1.0.29だと(funcall b)に対して何故か1が返る。 alisp,eclでは0が返る。 ちなみに#'の代わりにsymbol-functionを使うと0が返る。 x86なLinux環境が今無いの…

数学infix記法マクロ

(math 2 * x + 10 * y ^ 3) ↓展開 (+ (* 2 x) (* 10 (expt y 3)))

Paul Grahamのエッセイを読む1

一つづつ読んでくことにした。 Programming Bottom-Up ・Bottom-Up。 However, Lisp gives you much broader powers in this department, and augmenting the language plays a proportionately larger role in Lisp style-- so much so that Lisp is not ju…

OnLispを読む

SICPからの流れでそのままSchemeしか使ってこなかったので、OnLispを読んで料簡を広げようと思う。

プログラミング言語と背景にある理論

LISPはラムダ計算に基づいている。Haskellの型クラスは記号論理学的だ。例えば↓の式なんてシーケントそっくり。 sort :: Ord a => [a] -> [a] Haskellでは記号論理学という背景があるので、圏論を使用してモナドという強力な道具を取り込むことができた。 Ha…