結城浩のSICP日記 RSSフィード

2006-05-22

apply apply - 結城浩のSICP日記 を含むブックマーク

最近、applyの存在を失念することが多いので、何となくapply練習。

(+ 1 2) ;=> 3
(apply + '(1 2)) ;=> 3
(apply apply + '((1 2))) ;=> 3
(apply apply apply + '(((1 2)))) ;=> 3

evalと組み合わせて。

(define env (interaction-environment))
(eval '(+ 1 2) env)             ;=> 3
(apply + '(1 2))                ;=> 3
(eval (eval '(+ 1 2) env) env)  ;=> 3
(eval (apply + '(1 2)) env)     ;=> 3
(apply eval '((+ 1 2) env))     ;=> 3
(apply apply + '((1 2)))        ;=> 3

追記:SmalltalkerにしてSqueakerのsumimさんから楽しいコメントを受けたので追記。いつもありがとうございます(^_^)

(apply + '(1 2 3 4 5))          ;=> 15
(apply + 1 '(2 3 4 5))          ;=> 15
(apply + 1 2 '(3 4 5))          ;=> 15
(apply + 1 2 3 '(4 5))          ;=> 15
(apply + 1 2 3 4 '(5))          ;=> 15
(apply + 1 2 3 4 5 '())         ;=> 15

追記:何となくmy-evalとmy-applyを。

(define-syntax my-eval
  (syntax-rules ()
    ((my-eval expr)
      (eval expr (interaction-environment)))))

(define-syntax my-apply
  (syntax-rules ()
    ((my-apply f args ...)
      (apply f args ...))))

(my-eval '(+ 1 2 3 4 5))        ;=> 15
(my-apply + '(1 2 3 4 5))       ;=> 15
(my-apply + 1 '(2 3 4 5))       ;=> 15
(my-apply + 1 2 '(3 4 5))       ;=> 15
(my-apply + 1 2 3 '(4 5))       ;=> 15
(my-apply + 1 2 3 4 '(5))       ;=> 15
(my-apply + 1 2 3 4 5 '())      ;=> 15

sumimsumim2006/05/21 23:35(apply + 1 '(2))
(apply + 1 2 '())
とかも大事ですね。

トラックバック - http://sicp.g.hatena.ne.jp/hyuki/20060522