Source of Nothingness - cons

* Menu

About | Profile | まとめ | オリジナル | xyzzy | あんてな | | buzz

* 2009-12-20 :

#define XDEF(a, b, c, d, e, f, g) {a, b, c, d, e, f, g}

#define XDEFSF(a, b, c) XDEF (a, b, c, 2, 0, FFspecial_form, 0)
#define XSI_DEFSF3(name) XDEFSF (STR (name), "Fsi_" STR(name), "Ssi_" STR(name))

#define XDEFUN(a, b, c, d, e, f) XDEF (a, b, c, d, e, f, 0)
#define XDEFUN3(name, req, opt, f) \
  XDEFUN (STR (name), "F" STR (name), "S" STR (name), req, opt, f)
#define XSI_DEFUN3(name, req, opt, f) \
  XDEFUN (STR (name), "Fsi_" STR(name), "Ssi_" STR (name), req, opt, f)

#define XVDEF(a, b, c) {a, 0, b, 0, 0, c}
#define XDEFCONST(a, b) XVDEF (a, b, SFconstant | SFspecial)
#define XDEFCONST2Q(name) XDEFCONST (STR (name), "Q" STR (name))
#define XDEFVAR(a, b) XVDEF (a, b, SFspecial)
#define XDEFVAR2(name) XDEFVAR (STR (name), "V" STR(name))
#define XSI_DEFVAR2(name) XDEFVAR (STR (name), "Vsi_" STR (name))
#define XMAKE_SYMBOL(a, b) XVDEF (a, b, 0)
#define XMAKE_SYMBOL2(name) XMAKE_SYMBOL (STR (name), "V" STR (name))
#define XMAKE_SYMBOL2QC(name) XMAKE_SYMBOL (STR (name), "QC" STR (name))
#define XSI_MAKE_SYMBOL2(name) XMAKE_SYMBOL (STR (name), "Vsi_" STR(name))

(ReadMore...)

* 実践CLを読了

一番の収穫はCLOSについての理解が深まったこと。
xyzzyで使えないものだから、ちゃんと勉強したことが無くて:beforeとか:afterとかよく分かってなかったんだけど、やっと分かった。(とりあえず使ってみようと思うくらいには)
メソッド結合かぁ〜 よく考えたもんだなぁ〜
C++やJavaなんかのメソッドがクラスに属しているオブジェクト指向とは全くの別物だ。頭を切り替えて使わないといけない。

帰省中に付箋を付けながら読んでいたので、拾い上げておく。
(ReadMore...)

* 2008-03-12 :

(defun foo (i l)
  (if (>= i 5)
      l
    (foo (1+ i) (cons (lambda () i) l))))
(mapcar #'funcall (foo 0 nil))
=>(4 3 2 1 0)

* 2008-03-09 :

(ReadMore...)

* memo :

現在位置と前と後ろと目標位置との関係を調べて、近いほうから進む?

* Scrapbook : よろずや

http://www.geocities.co.jp/SiliconValley-SanJose/7474/ScriptingWithLisp.html

参考: 31.6.2. Scripting with CLISP
http://clisp.cons.org/impnotes.html#quickstart-unix

* xyzzy lisp : clone-buffer

とりあえずこんなところか。
主だったところはsession.lから。
outline-tree2をバッファバーの代わりにしつつ、rename-bufferを良く使う人向け。
もしくは*compilation*バッファとかでうっかりそのまま編集して、undoができず残念な思いをする人向け。
(defun clone-buffer (buffer-name &optional (buffer (selected-buffer)))
  (interactive "sClone Buffer: ")
  (let ((major buffer-mode)
        (minor (mapcan #'(lambda (mode)
                           (let ((var (and (consp mode) (car mode))))
                             (and (symbolp var)
                                  (boundp var)
                                  (symbol-value var)
                                  (list var))))
                       *minor-mode-alist*))
        (locals (mapcar #'(lambda (var)
                            (and (symbolp var)
                                 (local-variable-p var)
                                 (cons var (symbol-value var))))
                        *buffer-info-variable-list*))
        (point (point)))
    (set-buffer (create-new-buffer buffer-name))
    (insert-buffer buffer)
    (funcall major)
    (mapc #'(lambda (f) (and (fboundp f) (funcall f))) minor)
    (mapc #'(lambda (x)
              (when (and (car x) (symbolp (car x)))
                (make-local-variable (car x))
                (set (car x) (cdr x))))
          locals)
    (goto-char point)))

メモ:
undo情報をそっくり写せるとうれしいかも。
(ReadMore...)

* xyzzy lisp : insert-include

てきとー
(defun insert-include (file &optional cwd)
  (interactive "lHeader: " :default0 (merge-pathnames "*.h"))
  (unless cwd
    (if (get-buffer-file-name)
        (setq cwd (directory-namestring (get-buffer-file-name)))
      (return-from insert-include nil)))
  (if (consp file)
      (dolist (f file)
        (insert-include f cwd))
    (insert (format nil "~%#include \"~A\"" (substitute-string file (regexp-quote cwd) "" :case-fold t)))))

* 2006-09-20

で、移植の手順。
1. Emacs lisp 移植キットを使えるようにする。
2. 使えないもの(defgroup, font-lock関係, フレーム関係, etc)をコメントアウト
3. 文字の表現を書き直し(?a → #\a) 特に#\SPCとか
4. キーバインドの記述を書き直し(文字列 → 文字 or cons)
5. formatの引数を直す
6. 無い関数を記述 & 無い変数を代替の関数へ
7. 位置の調整(xyzzyは0 origin, emacsは1 origin)
8. functionとsymbol
9. その他こまごまとした修正

* 素数を求める

素直じゃない再帰・マクロ(ほぼ)無し
(defun generate-primes (limit)
  (format t "~{ ~D~}~%"
          (funcall (lambda (f c n &optional (x 3) (prime (list 2)))
                     (funcall f f c n x prime))
                   (lambda (f c n x prime)
                     (if (> x n)
                         (nreverse prime)
                       (if (funcall c c x prime)
                           (funcall f f c n (+ x 2) (cons x prime))
                         (funcall f f c n (+ x 2) prime))))
                   (lambda (c x prime)
                     (if (endp prime)
                         t
                       (if (zerop (rem x (car prime)))
                           nil
                         (funcall c c x (cdr prime)))))
                   limit)))

* 素数を求める

素直に再帰
(defun generate-primes (limit)
  (labels ((check (x prime)
             (cond ((endp prime)
                    t)
                   ((zerop (rem x (car prime)))
                    nil)
                   (t
                    (check x (cdr prime)))))
           (main (n x prime)
             (cond ((> x n)
                    (nreverse prime))
                   ((check x prime)
                    (main n (+ x 2) (cons x prime)))
                   (t
                    (main n (+ x 2) prime)))))
    (format t "~{ ~D~}~%" (main limit 3 (list 2)))))

* 2006-05-23 「A・E・H・R・T」でできるすべての文字列を表示するプログラム

http://d.hatena.ne.jp/tamago_girai/20060522#p1

pushが失敗だった。訂正版。
より簡潔に。再帰が一回分増えるのがアレだったんだけど、きれいな解答ならこちらかな。
(defun a-e-h-r-t (rest &optional pool)
  (if (not rest)
      (format t "~{~A~}~%" (reverse pool))
    (dolist (x rest)
      (a-e-h-r-t (remove x rest) (cons x pool)))))
(a-e-h-r-t '(a e h r t))

* clispcgi

とりあえずで作ったsplit-string
(defun split-string (string &optional (separator " "))
  (let ((n (position separator string :test #'(lambda (x y)
                                                (find y x :test #'char=)))))
    (if n
        (cons (subseq string 0 n) (split-string (subseq string (1+ n)) separator))
      (cons string nil))))
あとで末尾再帰へ書き直ししないと。

ファイルの入出力のときに「Bad address」のエラーが出ているみたい。
一応入出力には成功しているんだけど。

日本語関係をちゃんとすれば簡単な一行掲示板になるかな。

(ReadMore...)

* Scrapbook : CLISP - an ANSI Common Lisp Implementation

http://clisp.cons.org/