高階関数の定義(mapとfilter関数)
私がRubyで書いているLisp方言、 [Nendo]の開発状況続き。
mapとfilterの定義
先日『2009-04-13Nendo* mapとfilterが動いた』で書いた関数定義は、それぞれこんな感じ。 あんまり美しいとは言えないけど… もっと簡潔に書けるんだろうか。
- mapの定義
(define map (lambda (pred lst) (if (null? lst) '() (cons (pred (car lst)) (map pred (cdr lst))))))
- foreachはエイリアス定義
(define foreach map)
- filterの定義
(define filter (lambda (pred lst) (if (null? lst) '() (let ((result (pred (car lst)))) (if result (cons result (filter pred (cdr lst))) (filter pred (cdr lst)))))))
- ついでに値の標準出力への出力 p の定義
(define p (lambda (x) (printf "%s\n" x) x))
記念にFizzBuzz問題を書いてみた
実はletスペシャルフォームも実装済み。
- FizzBuzz問題
;; FizzBuzz write in Nendo (define fizzbuzz (lambda (max) (map (lambda (x) (let ((x (+ x 1))) (if (= 0 (% x 15)) "FizzBuzz" (if (= 0 (% x 3)) "Fizz" (if (= 0 (% x 5)) "Buzz" x))))) (range max))))
実行結果
nendo> (fizzbuzz 30) (1 2 "Fizz" 4 "Buzz" "Fizz" 7 8 "Fizz" "Buzz" 11 "Fizz" 13 14 "FizzBuzz" 16 17 "Fizz" 19 "Buzz" "Fizz" 22 23 "Fizz" "Buzz" 26 "Fizz" 28 29 "FizzBuzz" )
次は、可変長引数をあきらめた話と、Rubyのライブラリを使ってズルしまくりの話を書きます。