--- title: お勉強の成果 author: kazu634 date: 2008-07-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:4165;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}' categories: - gauche - Lisp ---

淡々と書いてみるよ。

Schemeの言語仕様

それが重要な結果を招くとわかった上で再定義することをSchemeの言語仕様は妨げません。すべてユーザの自由にゆだねられています。

append手続き

リストとリストを結合させる。

gosh> (append '(1 1 2) '(2 2 3))
(1 1 2 2 2 3)

car手続き

リストの先頭要素を返します:

gosh> (car '(1 2 3))
1

cdr手続き

リストの先頭をのぞいた残りの要素を返します。

gosh> (cdr '(1 2 3))
(2 3)

cons手続き

先頭要素と残りの要素からなるリストをくっつけてリストにする:

gosh> (cons 1 '(2 3))
(1 2 3)

list手続き

リストを作る手続き:

gosh> (list 1 2 3 4 5)
(1 2 3 4 5)

null?手続き

空リストかどうかを判断する手続き:

gosh> (null? '(1 2 3))
#f
gosh> (null? '())
#t

pair?手続き

空リストではないかどうかを判断する手続き:

gosh> (pair? '(1 2 3))
#t

fold手続き

リストの要素を順に処理していく手続きの基本になる手続き:

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 ;
}

foldの練習

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 そのものをあまり使わなくても。

How To Become A Hacker: Japanese

悟り体験…なんか言っていることがわかったかもしれな、

プログラミングGauche

プログラミングGauche