Más contenido relacionado
kyotolisp#1 LT3 美しいLispの書き方 (2)
- 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. フォーマッタを書く (続き)
一部の形式は特別扱いで、横モード → 縦モード の移行をします。
(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. 表示例
(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))))