突如覚醒した朝ラン生活の思い出 未知本エントリーで書いた、ストレスに打ち勝つための肉体(脳)&メンタル魔改造を決意し、唐突に始動した朝ラン生活。週2で15分以上走る、ただし途中歩いてもよい、というかなりゆるいルールが功を奏したのか、自分でも想定しなかったほどに細く長く気力が持ち、1月…
突如覚醒した朝ラン生活の思い出 未知本エントリーで書いた、ストレスに打ち勝つための肉体(脳)&メンタル魔改造を決意し、唐突に始動した朝ラン生活。週2で15分以上走る、ただし途中歩いてもよい、というかなりゆるいルールが功を奏したのか、自分でも想定しなかったほどに細く長く気力が持ち、1月…
Tag: 【募集中】 非破壊版、破壊版 関数対応表 引数の一部を処理中に変更する、所謂 "破壊的な関数"があります。これらの多くは引数を破壊しないバージョンも存在します。以下はその 破壊的な関数と 非破壊的な関数の対応表です。 append x nconc系
よくわかってなかったので調べた。 ファイルのトップレベルに `(eval-when (SITUATION*) ...)` を書いて、色んな読み込み方をした場合に評価されるか否か。「ただの式」ってのは eval-when で包んでない場合。 --- :execute :load-toplevel :compile-toplevel ただの式 コンパイルせずに load ○ ○ コンパイルしたとき ○ コンパイル済みを load ○ ○ こんなファイルを用意して ;;; test-eval-when.l (eval-when (:load-toplevel) (format t ":load-toplevel~%")) (eval-when (:compile-toplevel) (format t ":compile-toplevel~%")) (eval-when (:execute) (
Tag: 関数 &optionalや&keyで引数が指定されて呼び出されたか調べる lambda-listでは以下のようにして調べることができます (defun hoge (&key (keyword nil keyword-specified-p)) (print (list keyword keyword-specified-p))) (hoge) ; => (NIL NIL) (hoge :aaa nil) ; => (NIL T) (defun fuga (&optional (arg nil arg-specified-p) (print (list arg arg-specified-p))) (fuga) ; => (NIL NIL) (fuga nil) ; => (NIL T)
3つとか5つとかそれくらいのデータをまとめて扱いたい時は割とすぐ defstruct してて、他にも list とか vector とか hash-table とか色々やり方はあるんで、それぞれ速度的にどーなのよ?と。xyzzy だとそこまで速度を気にすることはあんまりない(compile しないで使ってたりするくらいだし、ヘビーな計算とかするなら SBCL とか使うだろうし)のだけど、気になったので調べてみた。 速い方からざっくり。データ型で言うと (simple-)vector, list plist, alist, hash-table structure アクセスする関数で言うと 速い組み込み関数*1 second, cadr, svref, elt first とか car とかでもほぼ変わらない 遅い組み込み関数 si:*slot-value, si:*index-slot-v
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 master · southly/xyzzy.src · GitHub let* の実装 src/lex.cc#20 lex_env::let xyzzy.src/lex.cc at master · southly/xyzzy.src · GitHub レキシカル環境に束縛を追加 src/eval.cc#548 eval xyzzy.src/eval.cc at mas
mapcan は第一引数の戻り値をリストだと期待して、そのリストに第一引数の関数を mapcar した結果を nconc でつなげていく関数です。 (defun my-null (x) (if (null x) (list t) (list nil))) (mapcan #'my-null '(nil 1 2 nil)) ;;=> (T NIL NIL T) ;(mapcar 'null '(nil 1 2 nil)) でいいのは承知の上 (mapcar #'my-null '(nil 1 2 nil)) ;;=> ((T) (NIL) (NIL) (T)) (apply #'nconc '((t) (nil) (nil) (t))) ;;=> (T NIL NIL T) nconc を append に置きかえた mapcaappend を定義してみます。 (defun mapcaapp
意図しない変数補足と対策について LOL(OnLisp) に沿ってまとめます。 nif (numeric if) をどう定義するかを例にします。nif は、条件部が負の数、0、正の数のどれかに応じた処理をするマクロです。以下は期待する挙動です。 (nif 0 "positive" "zero" "negative") ;;=> "zero" (nif 3 "positive" "zero" "negative") ;;=> "positive" (nif -3 "positive" "zero" "negative") ;;=> "negative" 次のような定義で問題ないように見えます。 (defmacro nif-buggy (expr pos zero neg) `(let ((obscure-name ,expr)) (cond ((plusp obscure-name) ,po
package Common lisp の package について調べてみました。package というのはネームスペースのような物で、プログラムの中を区切って名前が混じらないようにする仕組みです。名前の管理だけを行うので、一つのファイルに複数の package を定義する事も出来ます。これはライブラリの読み込み機能も付いた Scheme の libraryと比べて低レベルで面白いので clisp で調べてみました。 まず clisp を起動すると、あらかじめデフォルトの package の中に居る事になっています。現在の package は *package* で知る事が出来ます。システムに現在登録されている package を全部知るには list-all-packages を使います。 > *package* #<PACKAGE COMMON-LISP-USER> > (list-
はてなグループの終了日を2020年1月31日(金)に決定しました 以下のエントリの通り、今年末を目処にはてなグループを終了予定である旨をお知らせしておりました。 2019年末を目処に、はてなグループの提供を終了する予定です - はてなグループ日記 このたび、正式に終了日を決定いたしましたので、以下の通りご確認ください。 終了日: 2020年1月31日(金) エクスポート希望申請期限:2020年1月31日(金) 終了日以降は、はてなグループの閲覧および投稿は行えません。日記のエクスポートが必要な方は以下の記事にしたがって手続きをしてください。 はてなグループに投稿された日記データのエクスポートについて - はてなグループ日記 ご利用のみなさまにはご迷惑をおかけいたしますが、どうぞよろしくお願いいたします。 2020-06-25 追記 はてなグループ日記のエクスポートデータは2020年2月28
${XYZZY}/lisp/handler.l 参照。error, warn, signal 全部共通。 A. error CONDITION コンディション・オブジェクト(make-condition で作る奴)を渡すと、そのまま投げる。 B. error CONDITION-TYPE &rest ARGS CONDITION-TYPE のコンディション・オブジェクトを作って投げる。ARGS はそのコンディションのスロットをキーワード引数の形で。 (error 'some-condition :slot value) == (error (make-condition 'some-condition :slot value)) C. error FMT-CTRL &rest ARGS simple-error(warn だと simple-warning、signal だと simple
${XYZZY}/lisp/handler.l 参照。 handler-bind (handler-bind ((CONDITION-TYPE 'HANDLER-FN)) FORM*) FORM* を実行中に CONDITION-TYPE 型のコンディションが投げられると、HANDLER-FN に引数として投げられたコンディションを与えて呼び出す。 handler-bind がやることはそんだけで、エラーから回復とかさせるのは tagbody と go だとか block と return-from だとかで制御を飛ばす必要がある。飛ばさなかったら HANDLER-FN の戻り値は捨てられて、コンディションがさらに上(?)へ飛んでいく。 最初の式は展開するとこうなる。 (let ((si:*condition-handlers* (cons (list (cons 'CONDITION-T
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く