Racket

Scheme事始め5:四則演算を統一的に扱う

四則演算をラムダ関数として扱いなおしてみる "+,-,*,/"の4演算はすべて2項演算なので、「演算記号」を"#"とでも表すとすれば (# 3 4) のように書くこともできる 問題は、どうやって統一的に扱うのにどうするか 以下はその例。infixという関数をラムダ関数…

Scheme事始め4:自作関数

ラムダ関数(ただの関数)は「関数である」ことしか決めないので、それに名前をつけてとっておくには、そのための方法が必要になる > (define linear (lambda (a b x ) (+ (* a x ) b))) > (linear 2 3 4) 11 これは、「定義しましょう、linear というものを、…

Scheme事始め3:RacketでSchemeを扱ってみる

リストでない形で渡すとそれを値評価する。数値はそのやり方がOK、文字列は""で囲む > 123 123 > "Gauss" "Gauss" リストを与えよう 空リストはエラー(空リストはLISPの定義的にはnilという意味なのだけれど…) > () . #%app: missing procedure expression; …

Scheme事始め2:「ただの関数」

関数 関数っていうのは、のようなもの これをって、そう書かないといけない理由もないので、と書くことにする さらにの記号は、は関数を定義するんだよ、という意味だと知っていれば、わざわざ書かなくても用は足りるのでと書くことにする さらにのも空白文…

Scheme事始め1:リストがすべて

集合からn-タプル、ペアノの自然数 集合を要素数の括弧の入れ子とする。その入れ子的構造がn-タプル でとすると、もの構成要素となってくる。ここでは『空集合』、は『空集合を要素とする集合』。この2つは違うもの。違うというのはどれくらい違うかという…

Scheme事始め12:数学的な例を関数を作りながらみてみる(1)

インクレメントとデクレメント > (define ++ (lambda (i) (+ i 1))) > (++ 3) 4 > (define -- (lambda (i) (- i 1))) > (-- 5) 4 冪 > (define ** (lambda (a b) (expt a b))) > (** 2 3) 8 割り算関係。商、剰余、法数 > (define // (lambda (a b) (quotien…

Scheme事始め10:構文拡張

最低限の特殊形式では不便だ、となれば、拡張してやることもできる。そんな構文例が「拡張の塊」となると「LISP方言」のようなものになる 構文の拡張も自作関数もある意味では同じ…

Scheme事始め9:Scheme 型

非数値データ型 > (define type-check (lambda (x) (define form (lambda (str) (display "This is ") (display str))) (cond ((procedure? x) (form "a procedure: ") x) ((number? x) (form "a number: ") x) ((pair? x) (form "a pair: ") x) ((null? x) …

Scheme 最小限LISP Scheme事始め0:教育的環境

素数夜曲―女王陛下のLISP作者: 吉田武出版社/メーカー: 東海大学出版会発売日: 2012/06/01メディア: 単行本購入: 6人 クリック: 266回この商品を含むブログ (17件) を見る この本の後半を参考に: LISPについてまったく何も知らない状態でWindowsノートPCが…

Scheme事始め8:プログラム言語としてのSchemeのルール

Schemeの基礎 すべては()表記する(Listで表す)。自然数もListで表す 関数は「ただの関数」というラムダ関数 カリー化は変数を1つずつ扱う方法で()だけで実現できる ベータ簡約・イータ変換・ベータ正規形が関数の同等性や計算手続きの計算機実行を保証する…

Scheme事始め7:ラムダ算法

という関数があって、という関数があったとする という関数を考えることができる これはyについて関数g()を処理してそれをf()に渡して、という風に入れ子になっているし、1個ずつの変数処理なので、カリー化してある、と言えるもの という新たな関数ができ…

Scheme事始め14:高階手続

手続きを引数として取る手続き apply > (define iota (lambda (min max) (if (> min max) '() (cons min(iota (+ min 1) max))))) > (iota 0 9) (0 1 2 3 4 5 6 7 8 9) > (define num0-9 (iota 0 9)) > (apply + num0-9) 45 <|| --map >|lisp| > (map - num0…

Scheme事始め6:無駄に仰々しく耳慣れない単語たち

ラムダ記法(ただの関数)、car(かー)とcdr(くだー)、アルファ変換、ラムダさん方、ベータ簡約、イータ変換、関数適用、関数抽象… 耳慣れない単語が続くと疲れる 疲れるけれど、まぎれなくするための「わざわざの耳慣れなさ」と思って受け入れておこう たとえ…

Scheme事始め5:関数のカリー化

複数の変数からなる関数があったとき、その変数を1つずつ(プログラムの中で)扱うことをカリー化と言う(らしい) のようなこと Schemeで書くとこんな感じ?下がカリー化風? > ((lambda (x y z) (+ x y z)) 2 3 4) 9 > ((lambda (z) (+ z ((lambda (y) (+ y (…

Scheme事始め13:数学的な例を関数を作りながらみてみる(2)

ペアノ的自然数定義。1を0,1,2,...個要素とするリスト vの操作として表すsuccessorのsucc,predecessorのpred consは1を先頭に付け加えること、cdrは先頭を除くこと > (define succ (lambda (v) (cons 1 v))) > (define pred (lambda (v) (cdr v))) > (succ …