Yet Another Common Lisp Problems #1 singlep

なんか見つけたので気が向いた時に解いていってみよう。 ●問題1 リストの要素がただひとつか調べる述語 singlep を定義してください。 > (singlep '(a)) t > (singlep '(a b)) nil > (singlep '()) nil 解答 ホームページ移転のお知らせ - Yahoo!ジオシティ…

typespec+ を更新しました

NetInsaller 用 カフェイン中毒 変数の名前変えたのに古い名前のまま残ってたのがあったのを修正しました。せっかくなので紹介。xyzzy デフォルトの `typep` に未定義の typespec を与えると、黙って nil を返します。 (typep 3 'hoge) => nil typespec+ を…

condition-restart を更新しました

バグ修正とリファレンス書き直したり、とか。 NetInsaller 用 カフェイン中毒 変更点とか check-type でこないだ作った typespec+ を使うようにしました check-type 使ってたコードがちょびっと速くなったり、deftype した型を使えるようになります。 それで…

関数 abort と関数 muffle-warning

たぶん自分用メモ。CLHS ではこうなってるのだけど If no such restart exists, ..., and the functions abort and muffle-warning signal an error of type control-error.もし該当する再起動が見つからなければ、...、関数 abort および muffle-warning は…

Vim使いもEmacs小指になってしまえ

CopsLock キーを Ctrl にするのは有名だけど、うちで使ってる CapsLock キーの設定。窓使いの憂鬱で設定してる。 # 0. mayu では元々 Eisuu などという名前なので def alias = Eisuu # 1. Caps キーを Ctrl として使えるように mod ctrl += !!Caps # 2. Caps…

typespec+ をリリースしました

type specifier(型指定子、以下 typespec)をもっと便利に使いたいなと思って。 NetInsaller 用 カフェイン中毒 何が問題なのか? typep が比較的遅いだとか、xyzzy だと deftype した型は si:canonicalize-type しないといけないだとか、そんなこんなで ty…

symbol-macrolet を更新しました

いくつかバグ潰した。 symbol-macrolet 内の macrolet で定義したローカルマクロが展開されない場合があったバグを修正 オペレータに置いた lambda 式内の symbol-macro が展開されてなかったバグを修正 lambda, labels, flet, macrolet の lambda-list (仮…

eval-when

よくわかってなかったので調べた。ファイルのトップレベルに `(eval-when (SITUATION*) ...)` を書いて、色んな読み込み方をした場合に評価されるか否か。「ただの式」ってのは eval-when で包んでない場合。 --- :execute :load-toplevel :compile-toplevel…

アナフォリックマクロと package

via アナフォリックマクロとpacakge(2) - sileのブログit も一緒に export しといて使う側は use-package する、で個人的には困らないかなと思うのだけど、ライブラリとしてはまるっと use-package しなくてもマクロだけパッケージ名付きで `(anaph:awhen ..…

しょーもない再起動の使い方: typo

"apply" をよく "appyl" と typo して undefined-function とか怒られるので、もうちょっと気を利かせてくれないかな、とこんなことをした。 (defun appyl (fn &rest args) (restart-case (error 'undefined-function :name 'appyl) (apply () :report "「ご…

速度

3つとか5つとかそれくらいのデータをまとめて扱いたい時は割とすぐ defstruct してて、他にも list とか vector とか hash-table とか色々やり方はあるんで、それぞれ速度的にどーなのよ?と。xyzzy だとそこまで速度を気にすることはあんまりない(compile …

let* とスペシャル変数のバグ

http://fixdap.com/p/xyzzy/34388/ (defvar *special* :global) => *special* (let* ((*special* :local) (x *special*)) ; ここで *special* がシャドウされてない x) => :global 関係ありそうなのが src/eval.cc#1024 Flet_star xyzzy.src/eval.cc at mast…

Re: Re: case 構文のキーを括弧でくくると何が変わるのか

Re: case 構文のキーを括弧でくくると何が変わるのか - the Unspeakable One http://d.hatena.ne.jp/kitokitoki/20101001/p1 参考: CLHS: Macro CASE, CCASE, ECASE otherwise-clause なしの case をざっくり実装してみると、こんな感じ。 (defmacro %with-c…

setf expansion

setf 式を展開するのに使う5つの値。get-setf-expansion(xyzzy だと get-setf-method-multiple-value)で取得できるあれ。何度読んでも覚えられないので中途半端だけどメモ。 CLHS: Section 5.1.1.2 Setf Expansion (setf (ACCESSOR . ARGS) NEW-VALUE) tem…

setf の最適化に bug

以下の条件を満たすと place の subforms が評価される順番が変わってしまう。 PLACE に2つ以上の引数(subforms) その中にシンボルがある シンボルより後にシンボルではない式がある 3つ目の「シンボルではない式」が2つ目の「シンボル」の値に影響するよ…

再起動を使ってコンパイルしてなかったらコンパイルできる load-library とか

condition-restart 実装しといてどう使うのかよくわかってなかったりするので試しに使ってみた。とりあえず書いてみたレベルだけど gist に貼っといた。ライブラリ(*load-path* にあるやつ)をロードする時に コンパイル済みのが無かったら バイトコンパイ…

condition-restart をリリースしました

netinstaller 用 packages.l からどうぞ。インストールして *scratch* から↓やってみたらなんとなくわかると思いたい。 (require "condition-restart") (require "condition-restart-support") (restart:setup-key-bindings) (let ((age -3)) (assert (and (…

Condition System #2 error とかの引数

${XYZZY}/lisp/handler.l 参照。error, warn, signal 全部共通。 A. error CONDITION コンディション・オブジェクト(make-condition で作る奴)を渡すと、そのまま投げる。 B. error CONDITION-TYPE &rest ARGS CONDITION-TYPE のコンディション・オブジェ…

Condition System #1 handler-case と handler-bind の違い

${XYZZY}/lisp/handler.l 参照。 handler-bind (handler-bind ((CONDITION-TYPE 'HANDLER-FN)) FORM*) FORM* を実行中に CONDITION-TYPE 型のコンディションが投げられると、HANDLER-FN に引数として投げられたコンディションを与えて呼び出す。 handler-bin…

バイトコンパイルしてないファイルの一覧を得る

http://d.hatena.ne.jp/kitokitoki/20100520/p1 をパクった。 elisp には load-history なんてものがあるようだけど xyzzy にはないので *load-path* にあるものから。 (mapcan (lambda (dir) (mapcan (lambda (source) (unless (file-exist-p (concat sourc…

拡張にリファレンスを添付する方法

まずへなちょこリファレンス形式の xml でリファレンスを書く。addref 使うと title, type, arguments, package あたりは上手いこと生成してくれるんでラクチン。他の項目もタグだけ生成しといてもらえば中身埋めるだけなんでラクチン。というわけでまず add…

symbol-macrolet にリファレンスつけました

ネットインストーラ用 http://bowbow99.sakura.ne.jp/xyzzy/packages.l リファレンスって info-modoki-mode で見れるあれ。詳しくは http://xyzzy.s53.xrea.com/wiki/index.php?%A5%EA%A5%D5%A5%A1%A5%EC%A5%F3%A5%B9 あたり。 xyzzy 同梱の関数とかのリファ…

-*- encoding: UTF-8 -*- とか

coding: UTF-8 も使えるように UTF-8 は BOM なしの方で 保存するときに指定した文字コードで ;;; -*- encoding: XXX -*- を取ってくる ;;; encoding じゃなくて coding でもおk(emacs がそうなってるみたい?) (defun file-param-encoding (&optional bu…

typespec メモ

object の type を表記する symbol(atomic type specifier)か symbol で始まる list(compound type specifier)。`typep` とかに指定するやつ。その symbol(list の場合は car にある symbol)が xyzzy ではどう扱われてるのかって話。typep とかは symbo…

addref > info-modoki-mode

xyzzy-lisp 書いてるときは引数とか忘れたら F1 で info-modoki-mode 見てて、それだと reference に入ってないものが見れないんで自分で追加する方法。 必要なもの 全部 netinstaller からインストールできる。 info-modoki-mode: 見るために addref: 追加…

Condition を投げる人

誰も困らなさそうな非互換を見つけたのでとりあえずメモだけ残しとく。Common Lisp では condition 投げられたとき*1に、どの関数で投げたかで処理系の反応(デバッガ起動するか否か)が変わる。 ;;; Clozure CL にて ? (setq c (make-condition 'simple-con…

restart-case

PCL 読んでて、なんかできそうな気がしたのでやってみた。restart-case のちゃんとした仕様を把握してないけど、それっぽいことができたのでメモ。 ;; error 投げると restarter を呼び出す ;; restarter は #:restart-case の block からreturn-from するの…

(make-local-variable '*pre/post-command-hook*)

「このモードでは `*pre/post-command-hook*` で何かしたい」という時。とりあえずそれを実現する方法。 A: `*pre/post-command-hook*` を buffer-local に そのモードのフック(かなにか)で `*pre/post-command-hook*` を buffer-local にしておいて `add-…

CALL STACK を使いたい、のだけど

元々やりたいことは buffer にある expression を read して eval、的なこと。で condition を signal ったら CALL STACK を表示したい。stack-trace という関数があって、呼び出すと CALL STACK を出力してくれる。のだけど、signal ったのを handler-case …

list とか vector を使う structure

defstruct の NAME-AND-OPTIONS で :type を指定するとなんかできるっぽいので。 :type を指定する インスタンスが structure のインスタンスではなくて、指定された type になる。type は sequence の subtype であればいいみたい。 ;;; 実体が list な str…