kiyoka.2009_04_15 RSSPLAIN

Related pages: !kiyoka.blog.list !kiyoka.blog.2009_04
5555555555555555555555555555555555555544455555555555555454445355
5

[Nendo] 高階関数の定義(mapとfilter関数)

5

私がRubyで書いているLisp方言、 Nendoの開発状況続き。

5

 

5

mapとfilterの定義

5

先日『kiyoka.2009_04_13[Nendo] mapとfilterが動いた』で書いた関数定義は、それぞれこんな感じ。

5

あんまり美しいとは言えないけど... もっと簡潔に書けるんだろうか。

5

 

5
mapの定義
5
(define map
5
  (lambda (pred lst)
5
    (if (null? lst)
5
        '()
5
        (cons
5
         (pred (car lst))
5
         (map pred (cdr lst))))))
5

 

5
foreachはエイリアス定義
5
(define foreach map)
5

 

5
filterの定義
5
(define filter
5
  (lambda (pred lst)
5
    (if (null? lst)
5
        '()
5
        (let ((result  (pred (car lst))))
5
          (if result
5
              (cons
5
               result
5
               (filter pred (cdr lst)))
5
              (filter pred (cdr lst)))))))
5

 

5
ついでに値の標準出力への出力 p の定義
5
(define p
5
  (lambda (x)
5
    (printf "%s\n" x)
5
    x))
5

 

5

記念にFizzBuzz問題を書いてみた

4

実はletスペシャルフォームも実装済み。

4

 

4
FizzBuzz問題
5
;; FizzBuzz write in Nendo
5
(define fizzbuzz
5
  (lambda (max)
5
    (map
5
     (lambda (x)
5
       (let ((x (+ x 1)))
5
         (if (= 0 (% x 15))
5
             "FizzBuzz"
5
             (if (= 0 (% x 3))
5
                 "Fizz"
5
                 (if (= 0 (% x 5))
5
                     "Buzz"
5
                     x)))))
5
     (range max))))
4

[実行結果]

5
nendo> (fizzbuzz 30)
4
(1 2 "Fizz" 4 "Buzz" "Fizz" 7 8 "Fizz" "Buzz" 11 "Fizz" 13 14
4
 "FizzBuzz" 16 17 "Fizz" 19 "Buzz" "Fizz" 22 23 "Fizz" "Buzz" 26
4
 "Fizz" 28 29 "FizzBuzz" )
5

 

3

次は、可変長引数をあきらめた話と、Rubyのライブラリを使ってズルしまくりの話を書きます。

5

 

5

...comment disabled...