ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

sakurai言語を考える会コミュのLISPについて

  • mixiチェック
  • このエントリーをはてなブックマークに追加
プログラミング言語を開発する上で基本となるLISPという言語について、文系の人にでも理解してもらうトピです。

まず、2つの物が入る箱があります。
その箱には、数字か、英単語が入ります。
aとbという二つの単語が入っている箱を
(a . b)と書くことにします。
そうすると、(a . (b . c))
とかけます。空のはこは()と書くことにすると、空の箱が2つはいった箱は
(() . ()) とかけます。
てな感じ。

コメント(20)

すでに宇宙領域の話だ…orz

例題の構文の仕組みを説明してほしいな。
(b.c)の意味がわからない。
aの箱の中にbとcが入ってる二次配列なのかな?
あと上で言ってる数字の入った箱はどうなるのよ状態だし。

ごめんLISP勉強しておきます。
> その箱には、数字か、英単語が入ります。
ではなくて、箱の中には「記号(数字とか英単語)」か「箱」が入ると書いたほうが意味が伝わりやすいのではないでしょか?
うお、超個人的な話をするために作ったコミュなのに、
3人も入られてくれてる。アリガタヤ!!!
商品として、素敵な、sakurai特製、mp3プレーヤを進呈!!
とかいってみたりして、、、。(いや、コレはただの宣伝だろ)


>(b.c)の意味がわからない。いや、すいません間違えてました。orz...

さて、(a.b)の箱のbの部分にbとcが入った箱がはいっているとします。すると(a.(b.c))とかけます。
と書きたかったんですね。すでに、説明、間違えてるあたり、終わってる。すいません。出直すのは俺のほうです。みたいな。
いや、今、出直したんだった。
えーと。
a=null
b="b,c"
という解釈でOKですか?
うーむ。
とりあえず、図を見てもらえるとわかってもらえやすいかなぁ。
たくさんこの箱が書けるように、こんな風にリンクを矢印を使って書いたりします。
立体で書くと疲れるので、
上から見た箱で書いたりします。
さらに楽すると、文字だけで書くことになります。
(a.(b.(c.(d.()))))

と書くのはめんどくさい。

(a b c d)

等と事にしてしまいたい!!

なにかしら、法則を作ってそう書けるようにしよう!!
ああだこうだなやむ。
こう、一番後ろが空だったら、
.を使わないで書くことにしよう!

(a.(b.(c.(d.())))))

(a.(b.(c.(d)))))
と書く。
そして、.を使わないで書いてあるものが後ろについてたら
それも、.を使わないでかけるようにしよう。
ということで、変形していくと、、、。
(a.(b.(c.(d.()))))
(a.(b.(c.(d))))
(a.(b.(c d)))
(a.(b c d))
(a b c d)
このように、かけるぞ。
うおー、俺天才だぜ!!
と、AIを考えたジョン、マッカーシー大先生は
考えたわけですはい。
箱には名前つけられないのかな?
なんだかややこしい。
箱にa,b,cという名前があって、
中に簡単な英単語か数字を振った例文のほうが理解しやすいかも。
この例だとa,b,cが変数名(箱)なのか変数(中身)なのか理解できない。
この箱の種類には、consセルなる名前が付いております。

まさしく、箱でも変数でもなんでも、積み込める箱なのです。

あ、おはつです。konbuさん。
箱の種類の概念はわかるんだけど、
LISPでは箱に名前がなくてもエラーが出ないってことなのかな?
perlとかだと
箱の名前=箱の中身
という書き方をするし。
hako="箱の中身です";
みたいな感じで。

例えば、一番最初に出てくる
>aとbという二つの単語が入っている箱を
>(a . b)と書くことにします。
は、
(123 . これは箱の中身です)
と書き換えても変わるのは箱ではなく箱の中身(値)だけで
箱自体には変化はないということ?
>なおいたんさん
超遅レスですが。

lispでも変数はあります。
(define a 1) で a = 1
(define b "b") で b = "b"
(define a b) で a = b つまり a = "b"
というものに近いです。定義になって、代入ではないので微妙に違いますが。代入は
set!っていう命令があって
(set! a 1) で a = 1
(set! b "b") で b = "b"
(set! a b) で a = b つまり a = "b"
のほうが近いですけど、定義されてないと使えません。
javascriptとlispの主な例を上げます。
1 => 1
(+ 1 2) => 1 + 2
(+ 1 (* 2 3)) => 1 + 2 * 3
(* (+ 1 2) 3) => (1 + 2) * 3
(define a 1) => var a = 1;
(set! a 1) => a = 1;
(define (add x y) (+ x y)) => function add(x,y){return x+y;}
(define add (lambda (x y) (+ x y)) => var add = function(x,y){return x+y;}
(define a (quote (1))) => var a = [1,null];
というような関係にあります。
quoteは変数の中身を展開しないので
(define a (quote (b))) => var a = [new Symbol("b"),null];
というかんじになります。
aのなかみは(b) (javascriptだと[new Symbol("b"),null])で、bの変数の中身が1だったとしても(b)のままってところがjavascriptだと対応が難しいところです。文字列ではない名前を表すものをシンボルといいます。
これが、cとかd言語あたりまでくると違いが出てきます。

int add(int a, int b) { return a + b; }

// d
int function(int,int) addp =
int function(int a, int b) { return a + b; };
// c
int lambda001(int a, int b) {return a + b; }
int (*a)(int,int) = lambda001;

は違って、addは只のアドレスで、addpは関数のポインタになる。
わざわざ全部関数ポインタとはしない。

x86のアセンブラだと。
; eaxが第一引数で、第二引数からはプッシュすることに。
; eaxは関数の戻り値にもなる。
add: pop ebx
add eax, ebx
ret
lambda001:pop ebx
add eax, ebx
ret
addp: dw lambda001
呼び出しが
mov eax, 1
push 2
call add

move eax, 1
push 2
call [addp]
みたいなかんじ。

lispはlist構造で関数型言語なもっとも古い言語の一族。
javascriptはハッシュ構造でオブジェクト指向言語な新しい言語。
dはネイティブコンパイラでgcを持ってて開発中言語。
cはネイティブコンパイラでgcを持ってなくて普通。
アセンブラは機械語を人間が読めるようにしたもので原始的。

そんな感じ。

ログインすると、残り3件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

sakurai言語を考える会 更新情報

sakurai言語を考える会のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング