<blockquote>(define (solve-2nd f y0 dt)
(define y (integral (delay dy) y0 dt))
(define dy (integral (delay ddy) y0 dt))
(define ddy (stream-map f dy y))
y)</blockquote>

<blockquote>
(define (integral delayed-integrand initial-value dt)
(cons-stream initial-value
(let ((integrand (force delayed-integrand)))
(if (stream-null? integrand)
the-empty-stream
(integral (delay (stream-cdr integrand))
(+ (* dt (stream-car integrand))
initial-value)
dt)))))</blockquote>
(define (stream-cadr s)
(stream-car (stream-cdr s)))
(define (stream-limit s tol)
(if ( < (abs (- (stream-car s) (stream-cadr s)) tol)
(stream-card s)
(stream-limit (stream-cdr tol)))
<blockquote>(define (make-account number balance)
(define (withdraw amount)
(if (>= balance amount)
(begin (set! balance (- balance amount))
balance)
"Insufficient funds"))
(define (deposit amount)
(set! balance (+ balance amount))
balance)
(let ((balance-serializer (make-serializer)))
(define (dispatch m)
(cond ((eq? m 'withdraw) withdraw)
((eq? m 'deposit) deposit)
((eq? m 'number) number)
((eq? m 'balance) balance)
((eq? m 'serializer) balance-serializer)
(else (error "Unknown request -- MAKE-ACCOUNT"
m))))
dispatch))
(define (serialized-exchange account1 account2)
(let ((serializer1 (account1 'serializer))
(serializer2 (account2 'serializer)))
(if (< (account1 'number) (account2 'number))
((serializer2 (serializer1 exchange))
account1 account2)
((serializer1 (serializer2 exchange))</blockquote>
account1 account2))))
<blockquote>(define (make-semaphore-mtx maximal)
(let ((count maximal)
(mutex (make-mutex)))
(define (the-sema m)
(cond ((eq? m 'release)
(mutex 'acquire)
(unless (= count maximal)
(set! count (+ 1 count)))
(mutex 'release))
((eq? m 'acquire)
(mutex 'acquire)
(cond
((> count 0)
(set! count (- count 1))
(mutex 'release))
(else
(mutex 'release)
(the-sema 'acquire))))
(else
(error "Unknown request -- " m))))
the-sema))</blockquote>
b.
<blockquote>(define (loop-test-and-set! cell)
(if (test-and-set! cell)
(loop-test-and-set! cell)
'()))
(define (make-semaphore-ts maximal)
(let ((count maximal)
(guard (cons #f '())))
(define (the-sema m)
(cond ((eq? m 'release)
(loop-test-and-set! guard)
(unless (= count maximal)
(set! count (+ 1 count)))
(clear! guard))
((eq? m 'acquire)
(cond
(loop-test-and-set! guard)
((> count 0)
(set! count (- count 1))
(clear! guard))
(else
(clear! guard)
(the-sema 'acquire))))
(else
(error "Unknown request -- " m))))
the-sema))
</blockquote>
(define (ripple-carry-adder lista listb lists c)
(let ((lc '()))
(define (inner-ripple la lb ls ck)
(if (null? la)
'ok
(begin
(let ((cout (make-wire)))
(full-adder (car la) (car lb) ck (car ls) cout)
(append cout lc)
(inner-ripple (cdr la) (cdr lb) (cdr ls)) cout))))
(inner-ripple lista listb lists c)))
(define (or-gate a1 a2 output)
(let ((na1 (make-wire))
(na2 (make-wire))
(nand (make-wire)))
(inverter a1 na1)
(inverter a2 na2)
(and-gate na1 na2 nand)
(inverter nand output)))
(define (or-gate a1 a2 output)
(define (or-action-procedure)
(let ((new-value (logical-or (get-signal a1) (get-signal a2))))
(after-delay or-gate-delay
(lambda ()
set-signal! output new-value))))
(add-action! a2 or-action-procedure)
(add-action! a1 or-action-procedure)
'ok)
(define false #f)
(define (make-table same-proc)
(let ((local-table (list '*table*)))
(define (assoc key records)
(cond ((null? records) false)
((same-proc key (caar records)) (car records))
(else (assoc key (cdr records)))))
(define (lookup key-1 key-2)
(let ((subtable (assoc key-1 (cdr local-table))))
(if subtable
(let ((record (assoc key-2 (cdr subtable))))
(if record
(cdr record)
false)))))
(define (insert! key-1 key-2 value)
(let ((subtable (assoc key-1 (cdr local-table))))
(if subtable
(let ((record (assoc key-2 (cdr subtable))))
(if record
(set-cdr! record value)
(set-cdr! subtable
(cons (cons key-2 value)
(cdr subtable)))))
(set-cdr! local-table
(cons (list key-1
(cons key-2 value))
(cdr local-table)))))
'ok)
(define (dispatch m)
(cond ((eq? m 'lookup-proc) lookup)
((eq? m 'insert-proc!) insert!)
(else (error "Unknown operator -- TABLE" m))))
dispatch))
(define (make-deque) (cons '() '()))
(define (front-ptr deque) (car deque))
(define (rear-ptr deque) (cdr deque))
(define (set-front-ptr! deque item) (set-car! deque item))
(define (set-rear-ptr! deque item) (set-cdr! deque item))
(define (empty-deque? deque) (null? (front-ptr deque)))
(define (front-deque deque)
(if (empty-deque? deque)
(error "Empty deque")
(cadr (front-ptr deque))))
(define (rear-deque deque)
(if (empty-deque? deque)
(error "Empty deque")
(cadr (rear-ptr deque))))
(define (front-insert-deque! deque item)
(let ((ele (list '() item '())))
(cond ((empty-deque? deque)
(begin
(set-front-ptr! deque ele)
(set-rear-ptr! deque ele)))
(else
(begin
(set-car! (cddr ele) (front-ptr deque))
(set-car! (front-ptr deque) ele)
(set-front-ptr! deque ele))))))
(define (rear-insert-deque! deque item)
(let ((ele (list '() item '())))
(cond ((empty-deque? deque)
(begin
(set-front-ptr! deque ele)
(set-rear-ptr! deque ele)))
(else
(begin
(set-car! ele (rear-ptr deque))
(set-car! (cddr (rear-ptr deque)) ele)
(set-rear-ptr! deque ele))))))
(define (front-delete-deque! deque)
(cond ((empty-deque? deque)
(error "Empty queue " deque))
(else
(begin
(set-front-ptr! deque (caddr (front-ptr deque)))
(set-car! (car (front-ptr deque)) '())))))
(define (rear-delete-deque! deque)
(cond ((empty-deque? deque)
(error "Empty queue " deque))
(else
(begin
(set-rear-ptr! deque (car (rear-ptr deque)))
(set-car! (cddr (rear-ptr deque)) '())))))
(define (print-deque deque)
(define (print-dl double-list)
(if (null? double-list)
(display "")
(begin
(display (cadr double-list))
(print-dl (caddr double-list)))))
(cond ((empty-deque? deque) (display ""))
(else
(print-dl (front-ptr deque)))))
(define (make-queue)
(let ((front-ptr '())
(rear-ptr '()))
(define (set-front-ptr! item)
(set! front-ptr item))
(define (set-rear-ptr! item)
(set! rear-ptr item))
(define (empty-queue?)
(null? front-ptr))
(define (insert-queue! item)
(let ((new-pair (cons item '())))
(cond ((empty-queue?)
(set-front-ptr! new-pair)
(set-rear-ptr! new-pair))
(else
(set-cdr! rear-ptr new-pair)
(set-rear-ptr! new-pair)))))
(define (delete-queue!)
(cond ((empty-queue?)
(error "DELETE! called with an empty queue"))
(else
(set-front-ptr! (cdr front-ptr)))))
(define (print-queue)
(display front-ptr))
(define (dispatch m)
(cond ((eq? m 'insert-queue!) insert-queue!)
((eq? m 'empty-queue?) empty-queue?)
((eq? m 'print-queue) print-queue)
((eq? m 'delete-queue!) delete-queue!)
(else
(error "Unknown request -- MAKE-QUEUE" m))))
dispatch))
(define (print-queue queue)
(cond ((empty-queue? queue) (display ""))
(else
(display (front-ptr queue)))))
;; Slime Module + CLISP필 요한 것은 사실 몇줄 안된다. 상단에 load-path에는 slime이 설치된 곳(slime은 cvs로 설치했다) 을 inferior-lisp-program에는 clisp.exe의 경로를 적어주면 끝이다. 이후 (require 'slime) (slime-setup)은 단순한 실행 셋업이다..
(add-to-list 'load-path "d:/util/slime/") ; your SLIME directory
(setq inferior-lisp-program "d:/util/clisp/clisp.exe") ; your Lisp system
(require 'slime)
(slime-setup)
(add-hook 'lisp-mode-hook (lambda() (slime-mode t)))
(add-hook 'inferior-lisp-mode-hook (lambda () (inforior-slime-mode t)))
(autoload 'paredit-mode "paredit"
"Minor mode for psedo-structurally editing Lisp code." t)
(add-hook 'lisp-mode-hook (lambda () (paredit-mode +1)))
(load "d:/util/clisp/asdf/asdf.lisp")asdf는 어떻게 설치했느냐고? asdf는 cvs로 설치했다.
(pushnew "d:/util/clisp/lib/" asdf:*central-registry* :test #'equal)
http://common-lisp.net/project/cffi/releases/cffi_latest.tar.gzdarcs도 깔아주었다. 이 놈은 CVS, SVN과 비슷한 놈인거 같은데.. 일단은 설치..
http://common-lisp.net/project/babel/releases/babel_latest.tar.gz
darcs get http://common-lisp.net/project/alexandria/darcs/alexandria
darcs get http://common-lisp.net/~loliveira/darcs/trivial-features
<span class="br0"></span><blockquote><span class="br0">(</span>asdf:<span class="me1">operate</span> 'asdf:<span class="me1">load</span>-op :<span class="me1">lispbuilder</span>-sdl<span class="br0">)</span></blockquote><span class="br0">
해서 정상적으로 컴파일이 되었다면
</span><span class="br0"></span><blockquote><span class="br0">(</span>asdf:<span class="me1">operate</span> 'asdf:<span class="me1">load</span>-op :<span class="me1">lispbuilder</span>-sdl-examples<span class="br0">)</span></blockquote><span class="br0">
으로 examples를 컴파일하고 실제 예제를 실행시키면 된다.
</span><span class="br0"></span><blockquote><span class="br0">(</span>sdl-examples:<span class="me1">bezier</span><span class="br0">)</span></blockquote><span class="br0">
이상으로 3개월에 걸친 뻘짓을 마친다.
주의해야할 점은..
</span>
<br /><br />는 점이다.<br />이거 몰라서 <span class="br0">뻘짓한거 생각하면 참 우울하다..</span>