8

Click here to load reader

kyotolisp#1 LT3 美しいLispの書き方 (2)

Embed Size (px)

DESCRIPTION

http://www.slideshare.net/hayato_hashimoto/lisp-1-12901654 美しいLispの書き方 (1)の続きです。 フォーマッタのの完全なソースはhttps://gist.github.com/2a28842b5778bdd60f0aにあります。Gaucheで動きます。

Citation preview

Page 1: kyotolisp#1 LT3 美しいLispの書き方 (2)

フォーマッタ

Page 2: kyotolisp#1 LT3 美しいLispの書き方 (2)

フォーマッタ

S式フォーマッタはpretty-print (略称 pp)と呼ばれています。

Common Lispでは標準ライブラリにくっついています。

Page 3: kyotolisp#1 LT3 美しいLispの書き方 (2)

フォーマッタを書く

が崩れて変な感じになるようです。

が、コードの整形はできないし、横幅がつまるってくるレイアウト

するだけなので、大したことではないです。

それで、自分好みのコードフォーマッタを書きます。readしてwrite

、の2つです。

ードで表示する」ことと、いくつかの構文は定番どおりに表示する

ルールは、「括弧が2つまでなら横モード、それ以上になったら縦モ

Page 4: kyotolisp#1 LT3 美しいLispの書き方 (2)

フォーマッタを書く (続き)

縦モードで表示すべきかどうかを判定します。(define (very-heavy? expr) (cond ((pair? expr) (or (any (lambda (x) (and (object-pp-like-list? x) (any heavy? (dotted->proper (object-pp-x->list x))))) (dotted->proper expr)) (< 20 (length expr)))) (else #f)))

Page 5: kyotolisp#1 LT3 美しいLispの書き方 (2)

フォーマッタを書く (続き)

(let ((newline? (very-heavy? expr))) (let loop2 ((e (cdr expr))) (cond ((null? e)) ((and (pair? e) (null? (cdr e))) (if newline? (newline-indent level) (whitespace)) (loop (+ level tabstop) (car e))) ((pair? e) (if newline? (newline-indent level) (whitespace)) (loop (+ level tabstop) (car e)) (loop2 (cdr e))) (else (if newline? (newline-indent level) (whitespace)) (display

Page 6: kyotolisp#1 LT3 美しいLispの書き方 (2)

フォーマッタを書く (続き)

一部の形式は特別扱いで、横モード → 縦モード の移行をします。

input-from-file with-output-to-file shift receive)

(case (car expr) ((if set! case when call-with-input-file call-with-output-file with-

(when (and (pair? (cdr expr)) (or (not (list? (cadr expr))) (not (very-heavy? (cadr expr))))) (whitespace) (write (cadr expr)) (set! expr (cdr expr)))) ((define lambda) (whitespace) (write (cadr expr)) (set! expr (cdr expr)))

Page 7: kyotolisp#1 LT3 美しいLispの書き方 (2)

表示例(load "./cairolib.scm")(load "./cairo-wrapper.scm")(load "./parser.scm")(use srfi-27)(define repaint? #f)(define-method paint (cr (f <frame>) media) (paint-content cr f media) (for-each (cut paint cr <> media) (~ f 'kids)))(define (paged-media? media) (case media ((screen) #f) ((pdf) #t)))(define-method set-source-color ((cr (ptr <cairo_t>)) vec) (if (eq? 3 (vector-length vec)) (set-source-rgb cr (~ vec 0) (~ vec 1) (~ vec 2)) (set-source-rgba cr (~ vec 0) (~ vec 1) (~ vec 2) (~ vec 3))))

Page 8: kyotolisp#1 LT3 美しいLispの書き方 (2)

まとめ

自分の好きなルールでフォーマッタを書いてみてはどうでしょうか