Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2011-01-15

マクロ 99問 P01

| 19:44 | マクロ 99問 P01 - わだばLisperになる を含むブックマーク はてなブックマーク - マクロ 99問 P01 - わだばLisperになる

思い付きで作ってみたM-99ですが、果して役に立つのかまったく分からないので自分で問いてみることにしました。

時間を計測したら燃えるかと思い時間を測ってみましたが、結果は、52秒。

多分、マクロを書いたことがある方なら1分以内で解けるんじゃないでしょうか。

引数をクォートについてがテーマなのですが、1問目にしては難しいテーマなのかもしれません。

(let ((ut 0))
  (defun start ()
    (setq ut (get-universal-time)))
  (defun check ()
    (- (get-universal-time) ut)))

(start)
;=> 3504076885

;; 与えられた引数を全てQUOTEしてリストとして返すLISTQを作成せよ
;; テーマ:引数のクォート

(listq a b c d e)
≡ (list 'a 'b 'c 'd 'e)
;=> (A B C D E)

(defmacro listq (&rest args)
  `(list ,@(mapcar (lambda (x)
                     `(quote ,x))
                   args)))

(check)
;=> 41
;; テストするの忘れてた…

(listq a b c d)
;=> (A B C D)

(check)
;=> 52

ついでにGaucheでも

;; gauche
(use srfi-19)

(define *ct* 0)

(define (start)
  (set! *ct* (current-time))
  (time-second *ct*))
(define (check)
  (time-second (time-difference (current-time) *ct*)))

(start)
;=> 1295090821

(define-syntax listq
  (syntax-rules ()
    ((_) (list))
    ((_ arg rest ...)
     (cons (quote arg)
           (listq rest ...)))))

(listq a b c d e)
;=> (a b c d e)

(check)
223

(listq)
;=> ()

define-syntaxに慣れてないので使い方間違ったりして223秒かかりました。

ちなみに、Dylanもやってみようかなと思ったのですが、手元の開発環境が動かなくなっておりました…。

McCLIMのインスペクタとデバッガ

| 15:19 | McCLIMのインスペクタとデバッガ - わだばLisperになる を含むブックマーク はてなブックマーク - McCLIMのインスペクタとデバッガ - わだばLisperになる

Climacsやclim-listenerで遊んでいるとちょくちょくデバッガに落ちてしまいます。

SLIMEから起動の場合は、SLIMEに落ちるのですが、SLIME経由で起動していない場合は、デフォルトのどこかに落ちてしまい厄介なのですが、McCLIMのディレクトリを眺めていたらデバッガがあるようなので試してみました。

このデバッガは同じくCLIMのインスペクタに依存していたりするのですが、asdファイルがないのでとりあえず手動でロードすることにしました。

(ignore-errors
  (progn
    (let ((*default-pathname-defaults*
           (merge-pathnames "dists/quicklisp/software/mcclim-20101006-cvs/Apps/Inspector/"
                            ql:*quicklisp-home*)))
      (load "package")
      (load "disassembly")
      (load "inspector"))

    (let ((*default-pathname-defaults*
           (merge-pathnames "dists/quicklisp/software/mcclim-20101006-cvs/Apps/Debugger/"
                            ql:*quicklisp-home*)))
      (load "clim-debugger")))
  #+sbcl (setf (symbol-global-value '*debugger-hook*)
               #'clim-debugger:debugger)
  )

使用例では、

(let ((*debugger-hook* #'clim-debugger:debugger))
  (clim-listener:run-listener :new-process t))

のようにLETで束縛すればOKと書いてありますが、どうも別スレッドにすると違うデバッガが登録されてしまったりするようです。

しょうがなく(setf (symbol-global-value '*debugger-hook*) #'clim-debugger:debugger)して場当たり的な対処(SBCLの場合)

単体の実行ファイルを作成してそこから起動したり、StumpWMから起動する場合は落ちる場所がまちまちになるので*debugger-hook*にclim-debuggerを登録してから起動すると便利かなと思います。

clim-listener素晴らしい!

| 10:44 | clim-listener素晴らしい! - わだばLisperになる を含むブックマーク はてなブックマーク - clim-listener素晴らしい! - わだばLisperになる

すっかりCLIMづいている年始ですが、quicklispで、(QL-DIST:SYSTEM-APROPOS "clim")してみるとclim-listenerというのがあるので試してみました。

(ql:quickload :mcclim-uim) ;uimで日本語入力したい場合
(ql:quickload :clim-listener)

(clim-listener:run-listener :new-process 'T)

位で起動できると思います。

動作としては、CLのREPLとシェル的な機能が一緒になった感じで、LispマシンのListerの様な感じです、例えば、

,Show Directory

というコマンドでディレクトリの一覧を見ることができ、しかもファイルはクリッカブルだったりします。

コマンドを拡張したり、色々遊べそうです。