LISP Scheme Part8

このエントリーをはてなブックマークに追加
nilなんてない。
Cに展開しようとする辺り、まだ思考回路がこっち側にスイッチしてなさげ。
そのうちScheme/Lisp自身で考えられるようになれるようがんがれ。
954951:03/11/21 20:30
説明読んでていきなりnilとか書いてあったんで、面食らってるところなんですー(;_;)
シンボルnilがソースリスト中に現れたら、
schemeでは特別な意味を持たないが、
他のLISPでは特別な意味を持つでよいのかしら。

>>953
へい、がんがりまし。
awkで書かれたわずか500行のLispインタプリタ
awklispを読めばLispが理解できる
ttp://www.accesscom.com/~darius/




かも?
957955:03/11/21 22:07
>>956
955は>>951の「schemeを理解しよーとして、脳内でCに変換中。」に対するレスです。
コードを脳内でCに置き換えるよりも、脳内にインタプリタを内蔵してしまうほうが早いので。
scheme で
つい (setq a nil)
(if a hoge)
とかやって失敗する。
>>954
>schemeでは特別な意味を持たないが、
>他のLISPでは特別な意味を持つでよいのかしら。

Common Lisp と Emacs Lisp では、空リスト ()とシンボル NILは
Lispのオブジェクトとしては同一。(eq '() 'nil) => t
そして真偽値における偽値として使用される。
(if '() '1 '2) => 2
(if 'nil '1 '2) => 2
nilも()も(って同一物だが)は評価(evaluate)すると自分自身になる。
nil => nil

Schemeでは偽値として#fを使う。
(if '() '1 '2) => 1
(if 'NIL '1 '2) => 1
960959:03/11/22 14:34
しまった... NIL と nil を混ぜて使ってしまった。
961スレ違い:03/11/22 16:59
1ch.tv のLisp/Schemeスレはさびれているな。
というか1ch.tvって商売としてなりたっているのか?
そもそも1ch.tvというのが何なのかさえわかりませんが(w

ところでそろそろ新スレじゃないですかね。
Lisp歴は多少あるのですが、2ちゃんねるは初心者の者です。
新スレへの移行にあたって何か協力できることは無いかなと思っているんですが、
そこらへんの勉強をするための情報はどこにありますか?

とりあえず、新スレが立ち上がったら参考文献なんかの情報を補充したいと
思っています。
>>963
次のスレ立ては藻前に任せる。ガンガレよ。
966デフォルトの名無しさん:03/11/23 22:22
Lispのことはよく知らないオレに「マスターしたときの素晴らしい悟り」
というのを簡単に教えていただけませんか?

それと
http://www.shiro.dreamhost.com/scheme/trans/beating-the-averages-j.html
「LispのプログラムコードはLispのデータオブジェクトから出来ている。
それは、ソースコードは文字列で出来ていて、文字列は言語でサポートされている、
というようなつまらない意味じゃない。」
というのは、他のインタプリタのevalとは違うんでしょうか。

現在はjavaとかrubyあたりやってりゃいいかなと思ってるんですが
素晴らしい悟りが本当にあるならLispにチャレンジしようと思ってます。
マスターしないと教えてもわかんないよ。ガンガレよ。
>>966
そういう姿勢でいる限りおまいは何も得ることはできない
963じゃないけど立てました

次スレ

LISP Scheme Part9
http://pc2.2ch.net/test/read.cgi/tech/1069594582/
LISPのevalは単なるリスト処理なわけよ。
evalから見たら、いきなりリスト化された構文木が手元にあると思っていい。
後は意味解析して評価するだけの状態。
他の言語のevalだとまず見えないし、触れない。
>>969
>12 笑た。
それって単に人間プロセッサで構文木を作ってるだけじゃないの?
だとしたら人間にとって自然じゃないことをやってるから非効率だと思うが?
>>973 マクロで構文は人間向けに調整されている。反復系の構文も
マクロ展開すると条件分岐と goto になるが、書く人間は意識しないしな。
for(int i=0; i<10; i++) { ... }
(dotimes (i 10) ...)
を見て、下のほうが人間にとって自然じゃなくて非効率だと思うなら仕方が無いが。
大袈裟に「人間プロセッサ」って言う程頭使う様に見えるのか。
C言語 f()
LISP (f)
これだけの違い。
>>973
それ言ったら、他の言語を習得することも人間プロセッサって言わないか?
guile で define-syntax が通らん…
>>977
いや普段前置記法で思考してないから

中置記法の数式を Lisp の数式に置き換えるのに手間取る
>>966
まずreadで読み込んでLispで簡単に扱えるデータにしてる。
で、いじくるなりなんなりしてevalで評価してもらう。

こうするとevalではreadがやってくれるから文字列の解釈も必要なく
データの操作に専念できる。

データ自体を単純にするとデータの操作も簡単なもので十分になる。
仮にデータの操作が基本五関数の組み合わせで全てできるものとする。
この組み合わせを表現するプログラミング言語ができて
データからデータに変換をしてくれる。

入力データ -> プログラム -> 出力データ

このプログラミング言語をデータに変換できたとすると
入力データとプログラムをデータにしたものを入力に受け取って
出力データを返してくれるプログラムがあればよい。

[入力データ+プログラム] -> プログラム -> 出力データ

このプログラムもデータからデータの変換にすぎないので、
プログラミング言語の中でつくることができる。
これが万能関数evalである。

悟れた?
例えば

x = ( -b + sqrt( b * b - 4 * a * c ) ) / ( 2 * a )

みたいな数式を S 式に置き換えるのにこのスレの人はどれくらい掛かるの?
982981:03/11/23 23:52
作業用の変数にバインディングするのは OK という条件で
(setf x (/ (+ (- b) (sqrt (- (* b b) (* 4 a c)))) (* 2 a)))
にってこと?頭っから一発で書き下せるが…。確かに昔はめんどくさかったかも。
まぁ、中置記法リーダーマクロで
#$[x = ( -b + sqrt( b * b - 4 * a * c ) ) / ( 2 * a )]
ならコピペでもオッケーだがな。
>>981
普通に式を書き下すだけの時間しかかからんが?
よくわからんがこうして欲しいのか?
(set! x (/ (+ (- b) (sqrt (- (* b b) (* 4 a c)))) (* 2 a)))
986981:03/11/24 00:13
実際に計ってみたら
がんばったのに30秒も掛かった…
987デフォルトの名無しさん:03/11/24 02:18
まあまあ
単に慣れの問題だよ。
>>978 define-syntax は (use-modules ((ice-9 syncase))) すると使えるよ。
>>938
さっきECL入れてみたんですけど、非常に良い感じです。

938はん・・・なんちゅう処理系を教えてくれたんや・・・
>>987
義務教育で前置記法を標準にすれば、いいのにな
SBCL 凄い事になってるね。コンパイラと思えぬサポートプラットフォーム数だ。
http://sbcl.sourceforge.net/
>>990
(・∀・)イイ!! もう順番に悩まなくていいんだ.
カッコの種類にうるさい奴らも一掃.
>>988
ありがとうございます
通りました
>>990
後置記法ならともかく前置記法では頭の中で演算子スタックが必要になるのでは?
>>992
複雑に括弧のついた Lisp プログラムをエディタの支援なしで読めるの?
適切なインデントくらいはしていてもいいけど
>>994
+ を2項演算子として
前置記法
+ + + + + + + + 1 2 3 4 5 6 7 8 9
後置記法
1 2 3 4 5 6 7 8 9 + + + + + + + +
1000
999
998
>>996
嘘をつけ
交換則が成り立つから同じに見えるだけだろ
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。