lisp

apply の引数

apply: FUNCTION ARG &rest MORE-ARGS apply は何気に引数を複数に分けて受けられる。でも funcall とは違って、最初見たときは意味がわからん動作をする。 というのは、ARG と MORE-ARGS のうち一番最後の引数は list に突っ込んでおかねばならず、それ以外…

入力乗っ取り+疑似バックグラウンド実行

よい子は真似しちゃダメ ;;; キーボードの入力を乗っ取る ;;; とりあえず乗っ取ってみたかっただけなので、入力されたキーを ;;; そのまま buffer に insert ;;; C-g か RET で終了 (defun read-input () (popup-string "*** キーボード入力 横取り中 ***" (…

ちょびっと便利なコマンド

息抜きとか思ってちょっとだけ xyzzy lisp。やっぱり「こーゆーことさせたい」から実装するまでのフリクションが低い。慣れの問題だろうか。 行頭とインデントのとこ行ったり来たりする C-a (defun beginning-of-line+ () (interactive) (if (and (bolp) (eq…

car とか cdr とか caddar とかの読み方

twitter での会話を勢いで実装してみた。 最初の ca は「か」、cd は「くだ」 その後は a は「あ」、d は「だ」 最後の r は「ー」 (defun pronounce (function) (let ((name (coerce (symbol-name function) 'list))) (unless (and (eql (first name) #\c) …

minibuffer で何かする

コマンドとか実行中に minibuffer で入力させて文字列を受け取るのに、なんか色々する方法。単に文字列を入力させるなら `completing-read` 使えばいいんだけど、キーマップを変更したりインクリメンタルに何かしたりするには `*enter-minibuffer-hook*` と …

macroexpand-all

執拗な再帰マクロ展開 - 象徴ヶ淵 を見て「あー、あー(詳細は後述)」とか思ったので書き始めてみた。のだけど思ったよりめんどかったので、途中まで書いて GitHub に突っ込んどいた=>http://github.com/bowbow99/xyzzy.macroexpand-all/treeとりあえず単純…

subseq は新しいリストを作る・・・だと?

(eq (nthcdr 1 #1='(0 1 2)) (subseq #1# 1)) | nil (eq (nthcdr 1 #1='(0 1 2)) (nthcdr 1 #1#)) | t (eq (subseq #1='(0 1 2) 1) (subseq #1# 1)) | nil 上の1番目から明らかなように、subseqで切り出されたものはnthcdrで分けられたものとは異なる。2番目…

symbol-macrolet 内外での macrolet 問題

symbol-macrolet と macrolet symbol-macrolet 内で定義された symbol-macro は、macrolet で定義された local-macro の 展開時に変数として参照される symbol 展開後に変数として参照される symbol の両方を symbol-macro として展開する。 手順 macrolet …

macroexpand と environment object

ちょっと諦め気味なので、メモだけ残しておく。昨日からメモりすぎだけど。こんなマクロを書いた。 (defmacro merge-env (&environment env &optional outer) (if outer `(macroexpand '(merge-env) ,outer) env)) merge-env が呼ばれた環境の environment-o…

symbol-macrolet

symbol-macrolet の挙動をちゃんとわかってないことが判明したので sbcl で調べてみた。 operator は展開しない (defun foo () 'DEFUN) => FOO (symbol-macrolet ((foo 'SYMBOL-MACRO)) (list foo (foo))) => (SYMBOL-MACRO DEFUN) (symbol-macrolet ((foo '…

symbol-macrolet で shadowing しなきゃならん special-form

書いてて気づいたんだけど、単純に除外するんじゃなくて、たとえば (let (foo ...) ...) なら foo は symbol-macro じゃないけど他の bar とかは symbol-macro になるから、bar とかはちゃんと置換しなきゃいけないんだ。うん。で。 関数で lexical scope を…

symbol-macrolet と lexical scope

symbol-macrolet lexically establishes expansion functions for each of the symbol macros named by symbols.symbol-macrolet は、symbols で命名された symbol-macro を展開する機能を、レキシカルに確立します。 CLHS: Special Operator SYMBOL-MACROLE…

values への setf

defsetf とか define-setf-method とかの使い方はよく知らんのだけど、まぁ何とかなるかなーと思ってた。世の中そんなに甘くなかった。 define-setf-method (setf (access-fn args) new-value) とゆー風に呼び出される access-fn への setf を定義する defin…

GitHub に置いときました

http://github.com/bowbow99/ xl-expectations.l symbol-macrolet.l どっちも「リリースしました!」とか言える状態ではないんで、えーと、その、お察しください。GitHub のリポジトリは、管理画面からリポジトリ名の変更とかリポジトリの削除をできそうなん…

なんちゃって symbol-macrolet

(defmacro symbol-macrolet (defs &body body) (labels ((rplatom (old new forms) (cond ((null forms) nil) ((atom forms) (if (eq forms old) new forms)) (t (cons (rplatom old new (car forms)) (rplatom old new (cdr forms))))))) `(progn ,@(dolist…

when と and - higepon blog

個人的にはタイプ数が多くなっても「条件」と「処理」が区別できるから when が好き。なので条件が複数の場合でも when 使う。 (when (and <condition-1> <condition-2>) <do whatever>)</do></condition-2></condition-1>

なにかあったら出力

(format t "~:[~;~:*~S~]" <なにか>) #1: nil/non-nil で分岐 "~:[こっち~;そっち~]" という format 文字列を置いとくと、そこに与えられる引数が nil なら "こっち" が、non-nil なら "そっち" が出力される。 (format t "~:[nil だぉ・・・~;non-nil だぉ!!…

structure の conc-name

structure の定義は (get ' 'si:structure-definition) で得られるのはわかったけど、そっから conc-name を見つける方法がわからなくて struct.l を3時間くらい読んでみた。結果、structure の定義を作ってる si::*make-structure-definition なる関数に co…

コンスセルを展開させてみた

そもそも、これを読んで「へぇーへぇーへぇー」とか言ってた。 alist 例.((foo . 1) (bar .2) ...)とplist 例.(foo 1 bar 2 ....)の使うコンスセル数は同じことが知られています。 10分でコーディング x 2 〜リストの破壊的操作篇〜 - わだばLisperになる …

リストの破壊的操作

リストの破壊的操作をする - 象徴ヶ淵 経由http://cadr.g.hatena.ne.jp/g000001/20090521/1242909362 の問題 nalist-to-plist (nalist-to-plist '((foo . 1) (bar . 2) (baz . 3))) => (foo 1 bar 2 baz 3) らしい。(key1 value1 key2 value2 ...) という li…

#n# とか #n=ナントカ とか

ちゃんとした説明を読んだことが無いので間違ってるかもしれない。この記法(?)のちゃんとした名前を、そんなものあるのかどうかも知らないけど、知らないのでどう調べていいのかわからない。"common-lisp #n#" とかでググっても # が無視されちゃうみたい…

データっていうか高階関数なら使えます

データが扱える人を探せ! - 象徴ヶ淵 経由 JAVA5.0でGO!! | プログラミングに自信があるやつこい!!こないだ トランプを配 ったらトラックバックをもらったのでお礼?お返し?に、という建前で遊んでみた。こーゆーの楽しい。ついでに言うと他の人の見…

symbol-value と boundp はlexical な binding を無視する

(let ((x 'foo)) (symbol-value 'x)) => 変数が定義されていません: x (let ((x 'foo)) (boundp 'x)) => nil なんで・・・ Notes: The function bound determines only whether a symbol has a value in the global environment; any lexical bindings are i…

interactive で任意の動作をさせる list について調べた

selection があれば selection の region があれば region の C-u されてれば、現在行の前後の行の C-u されてればバッファ全体の それ以外なら現在行の start と end を受け取る interactive なんてのがあれば便利かなぁ、という気がしたので作ってみる。 …

interactive で任意の動作をさせる list のまとめ

interactive の引数として list を渡せばおk list を返す方法は、単にそこに書いてある式が評価される(っぽい)のでどーにでもなる interactive にした関数の各引数は、その list の各要素に束縛される 順番は、えーと、respectively。(ひとつめの引数は…

トランプを配る

http://ameblo.jp/programming/entry-10001721422.html 制限時間10分って言ってるのに1時間以上かかった、もうだめぽ。 (defun replace-nth (SEQ INDEX NEW &optional RET) (when (and RET (> INDEX (length SEQ))) (error "replace-nth: INDEX is higher th…

flet と labels の違い

どこかでどっちかは再帰ができないとか聞いた気がしたので確かめてみた。 (defun hoge (&optional arg) 'defun) => hoge (flet ((hoge (&optional arg) (if arg (hoge) 'flet))) (values (hoge t) (hoge nil))) => defun => flet (labels ((hoge (&optional …

))) ;|#

なんか気分が乗らないので小ネタを披露。あるファイルに lisp を書いてて、書きかけの関数があるけど今すぐにこのファイルを読み込みたい!けどこの書きかけの関数のせいで「予期しないEOFを検出しました」とか怒られる!ってときは、その書きかけの関数をコ…

regexp-keyword-list

指定した正規表現にマッチする文字列に色をつける機能。reference によればこんな風に使う。 ;; regexp-keyword-list に使う list を用意しておいて (defvar *hoge-regexp-keyword-list* (compile-regexp-keyword-list '(("regexp" CASE-FOLD COLOR *CONTEXT…

関数内のマクロが展開されるのはどの時点

なんか日本語不自由なタイトルだ。 前回 lisp-unit.lisp のこと書いた中で、macro を含む関数を作るとその macro は展開されたカタチで保存される、みたいなことを書いたのだけど、*scratch* で色々やってたらそーでもない場合もあるみたいだったので調べて…