--- title: お勉強の成果 author: kazu634 date: 2008-07-27 url: /2008/07/27/_1053/ 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:4165;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}' categories: - gauche - Lisp ---
淡々と書いてみるよ。
それが重要な結果を招くとわかった上で再定義することをSchemeの言語仕様は妨げません。すべてユーザの自由にゆだねられています。
リストとリストを結合させる。
gosh> (append '(1 1 2) '(2 2 3)) (1 1 2 2 2 3)
リストの先頭要素を返します:
gosh> (car '(1 2 3)) 1
リストの先頭をのぞいた残りの要素を返します。
gosh> (cdr '(1 2 3)) (2 3)
先頭要素と残りの要素からなるリストをくっつけてリストにする:
gosh> (cons 1 '(2 3)) (1 2 3)
リストを作る手続き:
gosh> (list 1 2 3 4 5) (1 2 3 4 5)
空リストかどうかを判断する手続き:
gosh> (null? '(1 2 3)) #f gosh> (null? '()) #t
空リストではないかどうかを判断する手続き:
gosh> (pair? '(1 2 3)) #t
リストの要素を順に処理していく手続きの基本になる手続き:
gosh> (fold + '(1 2 3 4 5 6 7 8 9 10)) 55
やっていることはperlのforeachみたいな感じなのかな?
# === use === use strict; use warnings; # === main === my @array = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10); my $sum = ; foreach my $i (@array) { $sum += $i; } print $sum, "\n";
Cだとこんな感じ:
/* ======================= */ /* === Include library === */ /* ======================= */ #include <stdio.h> /* ============ */ /* === main === */ /* ============ */ int main(int argc, char *argv[]) { int array[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int sum = ; int i; for (i = ; i < (sizeof(array) / sizeof(int));i++) { sum += array[i]; } printf("%d", sum); return ; }
gosh> (define (pick-least a b) (if (< a b) a b)) gosh> (define (min-number lis) (fold pick-least +inf.0 lis)) gosh> (min-number '(0 1 2 3 4 5 6 7 8))
こんな書き方もOKらしい:
>||(define (min-number lis) (define (pick-least a b) (if (< a b) a b)) (fold pick-least -inf.0 lis))
(define (length lis) (define (increment2 a b)(+ b 1)) (fold increment2 lis))
LISP は、それをモノにしたときのすばらしい悟り体験のために勉強しましょう。この体験は、その後の人生でよりよいプログラマーとなる手助けとなるはずです。たとえ、実際には LISP そのものをあまり使わなくても。
悟り体験…なんか言っていることがわかったかもしれな、