--- title: 自分でmaxを定義してみる author: kazu634 date: 2008-09-27 wordtwit_post_info: - 'O:8:"stdClass":13:{s:6:"manual";b:0;s:11:"tweet_times";i:1;s:5:"delay";i:0;s:7:"enabled";i:1;s:10:"separation";s:2:"60";s:7:"version";s:3:"3.7";s:14:"tweet_template";b:0;s:6:"status";i:2;s:6:"result";a:0:{}s:13:"tweet_counter";i:2;s:13:"tweet_log_ids";a:1:{i:0;i:4307;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}' categories: - gauche - Lisp ---

もしや

(define (my_max . lis)
(cond [(null? lis) #f]
[(= (my_length lis) 1) (car lis)]
[(= (my_length lis) 2) (cond [(<= (car lis) (cadr lis)) (cadr lis)]
[(>= (car lis) (cadr lis)) (car lis)])]
[(>= (my_length lis) 3) (cond [(<= (car lis) (cadr lis)) (my_max (cons (cadr lis) (cddr lis)))]
[(>= (car lis) (cadr lis)) (my_max (cons (car lis) (cddr lis)))])]))
gosh> (my_max 1 2 3 4 5)
(2 3 4 5)

になるのは、consすると二回目のmy_maxの引数の数が1だと思われているから?ちょっとがんばってみよう。

追記:

(define (my_max . lis)
(cond [(null? lis) #f]
[(= (my_length lis) 1) (car lis)]
[(= (my_length lis) 2) (cond [(<= (car lis) (cadr lis)) (cadr lis)]
[(>= (car lis) (cadr lis)) (car lis)])]
[(>= (my_length lis) 3) (cond [(<= (car lis) (cadr lis)) (car (cons (cadr lis) (cddr lis)))]
[(>= (car lis) (cadr lis)) (car (cons (car lis) (cddr lis)))])]))
gosh> (my_max 1 2 3 4 5)
2

となるから自分の勘違いかな?

追記の追記:

(define (my_max . lis)
(cond [(null? #?=lis) #f]
[(= (my_length lis) 1) (car lis)]
[(= (my_length lis) 2) (cond [(<= (car lis) (cadr lis)) (cadr lis)]
[(>= (car lis) (cadr lis)) (car lis)])]
[(>= (my_length lis) 3) (cond [(<= (car lis) (cadr lis)) (my_max (cons (cadr lis) (cddr lis)))]
[(>= (car lis) (cadr lis)) (my_max (cons (car lis) (cddr lis)))])]))
gosh> (my_max 1 2 3 4 5)
#?=lis
#?-    (1 2 3 4 5)
#?=lis
#?-    ((2 3 4 5))
(2 3 4 5)

いや、勘違いじゃなかったぞ!