フォーマッタ
フォーマッタS式フォーマッタは pretty-print (略称 pp)と呼ばれています。Common Lispでは標準ライブラリにくっついています。
フォーマッタを書くが、コードの整形はできないし、横幅がつまるってくるレイアウトが崩れて変な感じになるようです。それで、自分好みのコードフォーマッタを書きます。readしてwriteするだけなので、大したことではないです。ルールは、「括弧が2つま...
フォーマッタを書く (続き)縦モードで表示すべきかどうかを判定します。(define (very-heavy? expr)  (cond    ((pair? expr)      (or        (any          (lambd...
フォーマッタを書く (続き)(let ((newline? (very-heavy? expr)))  (let loop2 ((e (cdr expr)))    (cond      ((null? e))      ((and (pair...
フォーマッタを書く (続き)一部の形式は特別扱いで、横モード → 縦モード の移行をします。(case (car expr)  ((if set! case when call-with-input-file call-with-output-...
表示例(load "./cairolib.scm")(load "./cairo-wrapper.scm")(load "./parser.scm")(use srfi-27)(define repaint? #f)(define-method...
まとめ自分の好きなルールでフォーマッタを書いてみてはどうでしょうか。
Upcoming SlideShare
Loading in …5
×

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

1,477 views
1,349 views

Published on

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

1 Comment
0 Likes
Statistics
Notes
  • http://www.slideshare.net/hayato_hashimoto/lisp-1-12901654
    美しいLispの書き方 (1)の続きです。 フォーマッタのの完全なソースはhttps://gist.github.com/2a28842b5778bdd60f0aにあります。Gaucheで動きます。
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Be the first to like this

No Downloads
Views
Total views
1,477
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
5
Comments
1
Likes
0
Embeds 0
No embeds

No notes for slide

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

  1. 1. フォーマッタ
  2. 2. フォーマッタS式フォーマッタは pretty-print (略称 pp)と呼ばれています。Common Lispでは標準ライブラリにくっついています。
  3. 3. フォーマッタを書くが、コードの整形はできないし、横幅がつまるってくるレイアウトが崩れて変な感じになるようです。それで、自分好みのコードフォーマッタを書きます。readしてwriteするだけなので、大したことではないです。ルールは、「括弧が2つまでなら横モード、それ以上になったら縦モードで表示する」ことと、いくつかの構文は定番どおりに表示する、の2つです。
  4. 4. フォーマッタを書く (続き)縦モードで表示すべきかどうかを判定します。(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)))
  5. 5. フォーマッタを書く (続き)(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
  6. 6. フォーマッタを書く (続き)一部の形式は特別扱いで、横モード → 縦モード の移行をします。(case (car expr) ((if set! case when call-with-input-file call-with-output-file with-input-from-file with-output-to-file shift receive) (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)))
  7. 7. 表示例(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))))
  8. 8. まとめ自分の好きなルールでフォーマッタを書いてみてはどうでしょうか。

×