kiyokaのブログアーカイブ

Archive of old blog posts

高階関数の定義(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のライブラリを使ってズルしまくりの話を書きます。