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 |

2010-09-14

コンスセルのアスキーアート

| 00:05 | コンスセルのアスキーアート - わだばLisperになる を含むブックマーク はてなブックマーク - コンスセルのアスキーアート - わだばLisperになる

以前、lisppasteで、良い感じのコンスセルのAAを見掛けました。

+-------------------------------------------------------+
|                                                       |
|                                                       |
| +---+---+   +---+---+   +---+---+   +---+---+   +---+ |
| | * | * |-->| * | * |-->| * | * |-->| * | * |-->| 5 | |
| +---+---+   +---+---+   +---+---+   +---+---+   +---+ |
|   |           |           |           |               |
|   v           |           v           v               |
| +---+         |         +---+---+   +---+             |
| | 1 |         |         |NIL|NIL|   | 4 |             |
| +---+         |         +---+---+   +---+             |
|               v                                       |
|             +---+---+   +---+---+                     |
|             | * | * |-->| * |NIL|                     |
|             +---+---+   +---+---+                     |
|               |           |                           |
|               v           v                           |
|             +---+       +---+---+                     |
|             | 2 |       | * |NIL|                     |
|             +---+       +---+---+                     |
|                           |                           |
|                           v                           |
|                         +---+                         |
|                         | 3 |                         |
|                         +---+                         |
+-------------------------------------------------------+

のようなものなのですが、どうも専用の関数で描画している様子。

CLikiに登録されているライブラリでもなく、そのうち探してみようと思ってすっかり忘れていました。

今日ふと思い出したので、ググったりしてソースを見付けました。

作者は、comp.lang.lispの常連でもある、<PJB> Pascal J. Bourguignonさんで、Bourguignonさんのユーティリティ集の中に含まれているようです。

導入方法(例)

$ darcs get http://darcs.informatimago.com/darcs/public/lisp common-lisp
$ ln -s system.asd asdf:*central-registry*のディレクトリ

論理パスを設定

;; /share/sys/cl/src/にcom/informatimago/common-lispとして設置した場合
;; (つまり、/share/sys/cl/src/com/informatimago/common-lisp に置いた場合)
(setf (logical-pathname-translations "packages")
      `(("**;*.*.*" "/share/sys/cl/src/**/*.*")))

;; (TRANSLATE-LOGICAL-PATHNAME "PACKAGES:COM;INFORMATIMAGO;COMMON-LISP;HTML401.LISP")
;; 等で動作確認

SBCLの場合、 SB-IMPL::*EXTERNAL-FORMATS* の仕様が古いもの(リスト)になっていて現在(ハッシュ)と形式が違うのでちょっと修正。

;; common-lisp/character-sets.lisp"
(defparameter *lisp-encodings*
  #+clisp (group-charset-aliases)
  #+(OR) (mapcar (lambda (x) (mapcar 'string-upcase (first x)))
                   SB-IMPL::*EXTERNAL-FORMATS*)
  #+sbcl (LET (ANS)
           (MAPHASH (LAMBDA (K V) 
                      (DECLARE (IGNORE K))
                      (PUSHNEW (MAPCAR #'STRING-UPCASE (SB-IMPL::EF-NAMES V))
                               ANS
                               :TEST #'EQUALP))
                    SB-IMPL::*EXTERNAL-FORMATS*)
           ANS)
  #+cmu   '(("ISO-8859-1"))          ; :iso-latin-1-unix ;  what else?
  #-(or clisp sbcl cmu)
  (progn
    (warn "What are the available external formats in ~A ?"
          (lisp-implementation-type))
    '(("US-ASCII"))))

そして、

(asdf:oos 'asdf:load-op :com.informatimago.common-lisp)

のようにして導入。

色々なものが入ります。

動作は、

(IMPORT 'COM.INFORMATIMAGO.COMMON-LISP.CONS-TO-ASCII:DRAW-LIST)

(DRAW-LIST (LIST* '(1 2) 3 4))
;⇒
+-------------------------------+
|                               |
|                               |
| +---+---+   +---+---+   +---+ |
| | * | * |-->| * | * |-->| 4 | |
| +---+---+   +---+---+   +---+ |
|   |           |               |
|   |           v               |
|   |         +---+             |
|   |         | 3 |             |
|   |         +---+             |
|   v                           |
| +---+---+   +---+---+         |
| | * | * |-->| * |NIL|         |
| +---+---+   +---+---+         |
|   |           |               |
|   v           v               |
| +---+       +---+             |
| | 1 |       | 2 |             |
| +---+       +---+             |
+-------------------------------+

こんな感じ。

Bourguignonさんの書くソースはコーディング規約的なものがきっちりしていて職人的な香りがします。

ちなみに、自分がloopで、loopキーワードをキーワードシンボルで書くのはBourguignonさんの真似です。