新たな変数名の作成
id:yagiey:20100305:1267761841にトラバもらった。id:trotr:20100308:1268043643
引数を加工することが必要っぽいので、objectを書き直してみた。
今度はちゃんとget-○○○って名前にした。
(define-macro (object args . methods) `(lambda ,args (lambda (mname . margs) ,(cons 'case (cons 'mname (append (map (lambda (e) `((,(string->symbol (string-append "get-" (symbol->string e)))) ,e)) args) (map (lambda (e) `((,(car e)) (apply (lambda ,(cadr e) ,(caddr e)) margs))) methods)))))))
使ってみると
gosh> (define make-acc (object (owner balance) (show () (begin (print owner "'s balance: " balance) #t)) (deposit (amount) (begin (inc! balance amount) balance)) (withdraw (amount) (begin (dec! balance amount) amount)))) make-acc gosh> (define acc (make-acc "yagiey" 42000)) acc gosh> (acc 'get-owner) "yagiey" gosh> (acc 'get-balance) 42000 gosh> (acc 'show) yagiey's balance: 42000 #t gosh> (acc 'deposit 500) 42500 gosh> (acc 'withdraw 1500) 1500 gosh> (acc 'show) yagiey's balance: 41000 #t
いいかんじ?
メソッドの定義のところで、使う側にbeginを要求するのはダメか。
あと、文字列の連結はstring-joinじゃなくてstring-appendだったのか...。