[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [bep] learning lisp
- To: bep@argv.org
- Subject: Re: [bep] learning lisp
- From: Reiko TAKAHASHI <HFC03614@nifty.ne.jp> (高橋玲子)
- Date: Thu, 31 May 2001 07:32:16 +0900
- Delivered-To: mailing list bep@argv.org
- Mailing-List: contact bep-help@argv.org; run by ezmlm
高橋玲子@少し長いです。
Reply Mitsugu SAKAMOTO <mitsugu@...>'s message:
} 私が紹介したProgramming Emacs-lispによると、
}
} アトムやリストを表示したものを"シンボリック式(symbolic expressions)"、
} あるいは、より簡素には"S式(s-expressions)"と呼ぶ。用語「"式
} (expression)"」そのものでは、表示したアトムやリスト、あるいは、コンピュー
} タ内部に格納したアトムやリストを意味する。しばしば、これらを区別せずに用
} 語「"式(expression)"」を使う(さらに、多くの書籍では式の同義語として用
} 語「"フォーム(form)"」を使う)。
}
} だそうです。この"アトム"は"setq" "if" などの単語(?っといってはいけないの
} かな?>識者の皆さん)のことだと思います.
ありがとうございます。いろいろな用語があるんですね……。
「リスト」というのは何ですか?
(今説明してくださってもわからないかな……)
Reply TAKAHASHI Naoto <ntakahas@...>'s message:
} (progn (setq x 1)
} (setq y 2)
} (setq z 3))
}
} とすると、(setq x 1) と (setq y 2) はそれぞれ1と2という値を返しますが、
} これらの値は誰に利用されることもなく消えて行きます。最後の (setq z 3)
} が返す3という値は progn に引き継がれ、(progn ...) 全体の値となります。
そして、xに1、yに2、zに3が束縛された、という結果(副作用)はしっかり残
るんですね。
# (progn ...)の意味は、例の『やさしいEmacs-Lisp講座』の本で拾い読み
# しながら調べてみました。複数のS式を一つにまとめる関数(?)なんですね。
} この (progn ...) 全体を呼び出した関数が、その返された3という値を使うか
} どうかは、その呼び出し方に依存します。上の (setq x 1) や (setq y 2) の
} ように単に捨てられてしまうかもしれませんし、あるいは何かに使われるかも
} しれません。
べつに「評価結果」が使われなくても、プログラムとして、「副作用」が利用
できたり、なにか他の役割(?)を果たしていればいいんだということ……ですよね
?
} x や y のような単純なシンボルを評価すると、そのシンボルに束縛された値
} が返されます。数値や文字列を評価すると、評価された数値や文字列そのもの
} が返されます。
「変数」と「文字列」の違いは、どのように判断されますか?
1文字なのが変数で、2文字以上が文字列……でしょうか?
} setq はちょっと特別で、第1引数を評価しません。setq とほとんど同じこと
} をする関数に set というのもあり、こっちは第1引数も評価します。評価結果
} を→で書くことにすると、
}
} (setq x 'y) → y
} (set x 10) → 10
} x → y
} y → 10
}
} となります。ちなみに 'y は (quote y) の略記法で、quote というのは与え
} られた引数そのものを評価せずに返す関数です。もし一番上で (setq x y) と
} すると、y を評した結果を x に束縛することになってしまいます。
これ、とても難しかったのですが、以下のように考えてみました……。
(setq x 'y) → y
変数xそのものに、yという変数と同じ意味を持たせる。
なので、全体の評価結果はy(という変数)。
(set x 10) → 10
xを評価した結果(y)に10を束縛する。
束縛された値が10なので、このS式全体の評価結果は10。
x → y
1行目でxをyと見なして(?)いるので、xの評価結果はy。
y → 10
2行目で、yと見なされた(評価された)xに10を束縛しているので、yの評価結
果は10。
} > 単なる「用語」なのかもしれませんが、どうして「束縛」なのでしょう……?
}
} 単なる用語だと思っていいと思います。ただそれぞれの変数(シンボル)にはス
} コープ(範囲)というものがあって、束縛はその範囲内だけで有効です。
……今回、勝手に、せっかく何にでもなり得る変数なのに、特定の数値を入れ
て固定してしまうので、「束縛」っていうのかな……なんて考えたりしました(^
^;;;)。
} (setq a 10) → 10
} (let (a) (setq a 20)) → 20
} a → 10
}
} となります。2行目の setq で使われている a は let の中だけで有効です。
} ですから let を抜けた後の3行目で a を評価すると、1行目の結果が再び使わ
} れます。
なぜ、(let (a) (setq a 20))の最初のaが括弧でくくられているのでしょう?
# (let ...)も例の本で調べてみたのですが、こちらは、拾い読みでは全然
# わかりませんでした。括弧の中だけで有効なsetq関数みたいなもの、と
# 考えていいでしょうか?
} ここで問題です。2行目の a は let の内側だけで有効なのに、なぜ2行目全体
} を評価した結果が 20 になるのでしょうか。
……2行目の中でいちばん右の関数に当たる
(setq a 20)
から返される値が20なので、(let ...)は、その値を、全体の評価結果としてその
まま返しているのかな……と思ったのですが……???
# なんだか、おそろしくごちゃごちゃしてしまってすみません。
もっとすっきり書けるといいのですが……。
**-***-***-***-***-***-***-***-***-***-***-***-**
Reiko TAKAHASHI (高橋玲子)
E-mail: HFC03614@...
ICQ UIN: 85924121 (Twinkle)
**-***-***-***-***-***-***-***-***-***-***-***-**