Lisp Scheme Part17at TECH
Lisp Scheme Part17 - 暇つぶし2ch899:894
07/08/02 03:05:51
細かい話だけど、>>898
> "3.14 | 10" は「ここの定数には,仮数が10桁の範囲で
> 最良の3.14の近似を使ってくれ」と要求していることになる.
って書いてるけど

R5.97RSの該当部分を読むと
Implementations that use binary floating-point representations
of real number objects should represent x|p using a
p-bit significand if practical, or by a greater precision if a
p-bit significand is not practical, or by the largest available
precision if p or more bits of significand are not practical
within the implementation.
ってことなので、仮数部の指定が"実装内で現実的で無い"場合は
それより大きい仮数部を持つ浮動小数点表現をすればOK、という風に
読めるけど違うかな?メモリ量を最適化しようとする実装に対して
仮数部の最低ビット数を指示するためにある、という風に俺は解釈するけど、
どうなんだろう?

言い換えると、小さい仮数部pが数値が指定されたときにわざわざdoubleから
落としてsingleにする必要性があるのかってことだけど。

900:デフォルトの名無しさん
07/08/02 03:33:44
多くの処理系ではわざわざ定数をsingleにはしないだろうけど、もしそれで高速になるならば
しても良いという(コンパイラに対する)ヒントにはなるわな。
(そこまで最適化する処理系は少ないだろうけど)

901:デフォルトの名無しさん
07/08/02 12:37:25
common lisp の処理系で
> (hogehoge '#+ 1 '(1 2 3 4))
(2 3 4 5)
となる関数は無いでしょうか?

> (mapcar '#+ '(1 1 1 1)'(1 2 3 4))
(2 3 4 5)
でもいいんですが、リストの長さが不明な場面なので、
> (mapcar '#+ (make-sequence 'list (length'(1 2 3 4) :initial-element 1)))
こういう感じの実装くらいしか思いつきません。
もし標準的な関数があればそちらを使いたいところです。
よろしくおねがいします。

902:デフォルトの名無しさん
07/08/02 12:56:17
足すのが1に決まってるなら
(mapcar #'1+ '(1 2 3 4))
決まってないなら
(mapcar #'(lambda (x) (+ x 1)) '(1 2 3 4))
でいいんじゃないの? なにか書いてない他の制限があるなら知らんけど。


903:デフォルトの名無しさん
07/08/02 12:56:33
(mapcar #'(lambda (x) (+ x 1)) '(1 2 3 4))




904:デフォルトの名無しさん
07/08/03 05:51:13
>>899
10進法の1.2は2進法で1._0011_(2) ("_"で括った部分を繰り返し)という循環小数になるのでそれを例に採る.
私の理解ではその段落の意味するところは:
IEEE doubleを使うプロセッサ上の処理系は
"1.2d0" => 0 01111111111 00110011(40桁の略)0011
"1.2s0" => 0 01111111 00110011(12桁の略)001
or 0 01111111111 00110011(40桁の略)0011 (←2行上と同じ; 処理系が "practical" だと思えばこうなる)
となるだろう.ところが
"1.2 | 10" => 0 01111111111 001100110(この先,0が43桁続く; けちビットに注意)
となる(という私の理解).
2進10桁の精度で得た浮動小数点数を(例えば)IEEE double形式に「広げて」メモリに格納するということ.
C言語で
double f = 1.2f;
と書いたとき,fに格納される浮動小数点数が10進16桁の精度でなく8桁の精度しか持たないのと同じイメージ.

905:デフォルトの名無しさん
07/08/03 17:39:40
(define sqrt2
 (lambda (n)
  (if (zero? n)
   0
    (+ 1 (/ 1 (+ 1 (sqrt (- n 1))))))))


906:901
07/08/07 10:07:27
>>902-903
mapする関数側で工夫すればいいのですね。
スコープに注意しながら実装を進めてみます。
ありがとうございました。

907:894=899
07/08/07 17:49:33
>>904
俺の最初の質問に照らして読ませてもらうと、小さい
仮数部が指定された場合に、
・精度の低い浮動小数点表現に丸めた上で、残りは0を補充して格納する
・精度が大きい(greater)ぶんには特に問題なし
というのだと前者ということ?


908:デフォルトの名無しさん
07/08/08 01:34:33
(define (int-gen n m)
(if (> n m)
(list)
(cons n (int-gen (+ n 1) m))))

これで、

(int-gen 3 10)

とすると、(3 4 5 6 7 8 9 10)のリストができますよね?
このリストの要素を全てnにしたいのですがそうすればよいでしょうか?
(3 3 3 3 3 3 3 3)のような感じです。

909:デフォルトの名無しさん
07/08/08 01:50:57
(make-list (- m n -1) :initial-element n)

910:デフォルトの名無しさん
07/08/08 22:18:32
(loop for i from n to m collect i)
(loop repeat (- m n -1) collect n)

911:デフォルトの名無しさん
07/08/09 03:44:18
皆さん、Scheme書くときエディタ何使ってますか?

912:デフォルトの名無しさん
07/08/09 04:02:49
黒板

913:デフォルトの名無しさん
07/08/09 16:09:09
俺も黒板

914:デフォルトの名無しさん
07/08/09 16:23:23
2chブラウザ

915:デフォルトの名無しさん
07/08/09 21:30:06
とりあえず対括弧の強調は必須だが
普段サクラエディタ使ってるが
単語登録じゃハイフンで切られちゃって上手く行かず
正規表現コメントで限界まで登録…だけど
ちょっとオススメ出来ないなあ
emacsとかxyzzyとかだと大丈夫なのかな
キーバインド苦手で使ってないが

916:デフォルトの名無しさん
07/08/09 22:55:16
>>915
xyzzy+winkey.l は?

917:デフォルトの名無しさん
07/08/10 01:16:28
>>916
帰宅したら試してみる。

918:デフォルトの名無しさん
07/08/10 03:27:19
Emehcs

919:デフォルトの名無しさん
07/08/10 03:37:59
xyzzy + winkey + scheme-mode 試してみた
導入は手間だが、使えるね
Scheme用にしばらく使うことになりそう、thx!

920:デフォルトの名無しさん
07/08/10 07:08:15
MrEd

921:デフォルトの名無しさん
07/08/10 18:48:31
4回の授業でこんな課題出すんじゃねえこんちくしょうが!!!!!!1

922:デフォルトの名無しさん
07/08/10 19:20:17
自分で選んだ道だろうが小僧

923:デフォルトの名無しさん
07/08/10 20:49:36
vim+mzschemeうまく動く?

924:デフォルトの名無しさん
07/08/10 22:38:25
MzScheme も MrEd も DrScheme のやつか

925:デフォルトの名無しさん
07/08/11 01:21:01
on lisp を読んでる女子高生とアナフォリックマクロについて語り合いたい。

926:デフォルトの名無しさん
07/08/11 01:37:53
そんな幸せな場面想像したこともなかったわ。

927:デフォルトの名無しさん
07/08/11 05:37:54
"The little schemer"を読んでいるのですが、その中の始めに、
(((how) are) ((you) (doing so)) far)
の中にアトムが3個あるらしいのですが、どうしてですか?

928:デフォルトの名無しさん
07/08/11 07:32:38
アトムは12個じゃない?

929:デフォルトの名無しさん
07/08/11 10:04:41
要素は3個だと思うが。


930:デフォルトの名無しさん
07/08/11 11:22:21
>>928
>>929
ありがとうございます。
アトムと要素ってちがうんですか?

931:デフォルトの名無しさん
07/08/11 11:50:37
一番外側のリストの要素って
((how) are)と((you) (doing so))とfarとnilの4個じゃないの?
それとも要素数っていう場合最後のnilは数えない?

932:デフォルトの名無しさん
07/08/11 12:13:51
その最後の nil のみの () 空リストは通常要素ゼロと数えます。
リストの要素というのは通常 cons セルの数。

() = nil : 要素数ゼロ
(1) = [ 1 | ] -> nil : 要素数 1
(1 2) = [ 1 | ] -> [ 2 | ] -> nil : 要素数 2

で、問題のやつは cons セル 3 つなので要素数 3。

[ ((how) are) | ] -> [ ((you) (dosing so))| ]-> [ FAR | ]-> NIL


933:931
07/08/11 12:35:56
>>932
なるほど~
ありがとう

934:デフォルトの名無しさん
07/08/11 13:21:32
このばか者が!ワシに分かるようなプログラム言語にしないか!

935:デフォルトの名無しさん
07/08/11 13:34:04
括弧だけなんだからわかりやすくて楽じゃん。
C++の難解さときたら・・・

936:デフォルトの名無しさん
07/08/11 13:57:52
やだやだforthくらいわかりやすくないとやだ

937:デフォルトの名無しさん
07/08/11 14:11:35
Lispを判りやすいと思う人の数>Forth(r

938:デフォルトの名無しさん
07/08/11 14:27:57
Python が一番読みやすい
lisp は要素が横方向に膨らみすぎる

939:デフォルトの名無しさん
07/08/11 14:54:15
pyはなんか構文の後ろに:とか変なしるし付けないといかんのが嫌
pascalの.みたいにキモイ
インデントだけで済むとか言って余計な事が多すぎる
結局括弧使ってるし

940:デフォルトの名無しさん
07/08/11 14:58:43
インデントベースでカッコのないlispってないの?

941:デフォルトの名無しさん
07/08/11 15:05:59
>>939
余計な事なんてそんなにないでしょ
普通に書いている分には十分に読みやすい
ここで Python と lisp を比べてみるとカッコ関係なく lisp の読みにくさを痛感する
URLリンク(ja.doukaku.org)

942:デフォルトの名無しさん
07/08/11 15:20:57
カッコなんて気にしない

943:デフォルトの名無しさん
07/08/11 15:27:08
そう言い残して彼は秋葉原へ行きました
額にはバンダナを巻いて

944:デフォルトの名無しさん
07/08/11 15:28:09
pythonは掲示板にコード貼れない悲しさがあるね

945:デフォルトの名無しさん
07/08/11 15:36:56
SRFI 49: indentation-sensitive syntax
URLリンク(srfi.schemers.org)


946:デフォルトの名無しさん
07/08/11 15:44:56
SRFIの範囲ってわけわからんな。
どうせならpython風フロントエンドでも定義すりゃいいのに。

947:デフォルトの名無しさん
07/08/11 16:08:08
>>941
ちょっとそこサンプル眺めただけだけど、pythonの構文規則て面倒だと思うよ。
何がダメで何が許されてるのか判りづらい。
よくこれで破綻しないなと逆に感心してしまった。

そのサイトのpythonサンプルって既成のライブラリ呼んでるのが殆どで
読みやすいかどうかは判らなかったけど、例えば
URLリンク(ja.doukaku.org)
これのライブラリ使ってない方のコードのyieldとかの掛かり先の判りにくさとか。
COBOLみたいにカラム表示のあるエディタじゃないと厳しい。
インデント位置がほんとにそれで合ってるのか疑ってしまわない?
(LISPなら汚く書いてもppで大抵読めるコードになる)

948:デフォルトの名無しさん
07/08/11 16:45:01
じゃあエディタにカラム表示をつければいいんだ。
・・・え? そういう問題?

949:デフォルトの名無しさん
07/08/11 17:23:53
Pythonは紙に印刷したら定規あてて読まないといかん
マジで


950:デフォルトの名無しさん
07/08/11 17:45:22
Python はネスト深いとそうなるよなw

とは言え、C++ や Ruby ほどには破綻してないと思うよ

両方ともパーサに優しくない上に
C++ はもはや人間にすら読みづらい言語だし
Ruby は一見読みやすいがパーサの細かい挙動に気をつけないとハマる

あと Perl は…可読性とか考えたことあるのかなラリーってw

書いた時点でほぼパース済みの Lisp系はそういうことは無いわな
エディタに括弧対応の表示がないと辛いのが難点か

951:デフォルトの名無しさん
07/08/11 19:13:04
Perlって、悪いところ上げればキリがないと思うけど、
でも日本で名が知れたハカーでPerl常用してる人多いよね(宮川さんとか小飼弾氏とかはてな伊藤さん)。
あれって惰性で使い続けてるのか、それとも使いやすいから
使ってるのかよくわからんね。すごい人にとってはPerlって
いい言語なのかな。スレ違いでゴメンね。

952:デフォルトの名無しさん
07/08/11 19:37:05
perlは文系が好んで使う言語です
何故か

953:デフォルトの名無しさん
07/08/11 19:39:15
いくら「すごい人」が使っていても自分が嫌いなら気にすることはないと思う。

954:デフォルトの名無しさん
07/08/11 19:47:01
>>951
彼らは高次視覚野のニューロンがPerl向きに学習されている。
常人は真似しないほうが無難であろう。

955:デフォルトの名無しさん
07/08/11 20:07:13
Perlが常人向けじゃないなら、LispやSchemeはどーなんですか?


956:デフォルトの名無しさん
07/08/11 20:17:31
>>951
その連中は、派手に花火を打ち上げてるから目立つPerl者であって、
別にハッカーでもないだろ。

957:デフォルトの名無しさん
07/08/11 20:22:14
CPANがあるからじゃね?

958:デフォルトの名無しさん
07/08/11 20:39:54
Perlはできることが強力だからな、CPAN

959:デフォルトの名無しさん
07/08/11 20:41:02
途中で書きこんじまった

CPANも含めて。
多少の構文の違いなんて大した問題じゃないって人も多いし

960:デフォルトの名無しさん
07/08/11 20:44:26
不感症なんですのね

961:デフォルトの名無しさん
07/08/11 21:09:35
CPANはいいよね・・・
RubyforgeとかCheese Shopなんて霞んで見えてしまうぐらいに
ましてasdfなんて、ね

962:デフォルトの名無しさん
07/08/11 21:10:28
CPANのLISP版CLANて意味ないかな。
やっぱ実装が沢山あると難しいか。
ネットワーク系弱いし。名前負けしてるw

963:デフォルトの名無しさん
07/08/11 21:12:37
asdfでぐぐると痛そうなページがトップっすね

964:デフォルトの名無しさん
07/08/11 22:09:05
末端消費プログラマばかりなんだな、ここは。

965:デフォルトの名無しさん
07/08/11 22:17:59
これ見れば判るけどネストが異様に深い
URLリンク(ja.doukaku.org)

普通の言語ならガード節で処理するようなものも関数的にネストして処理するので深くなる
また束縛でスコープが増える分深くなると言うのもある
これはすべてのプログラムに影響することでそれを考えればPythonのyieldが判りづらい(判りづらいとは思わないけど)
なんてほんの些細なこと

可読性と統一性ってのは別の所にあって他の言語はそこをある程度崩して読みやすさを補っているんではないかと思う
Ruby読みにくいって言っている人が居るけど大抵の人はlispとRubyじゃRubyのほうが読みやすいというと思うよ
だってみんなもlispのコードをカッコ数で読んでいるんじゃないでしょ?
URLリンク(img264.imageshack.us)

966:デフォルトの名無しさん
07/08/11 22:19:51
気を落とすなよlisperども
頑張ってる連中もいるぞwww
スレリンク(tech板)l50



967:デフォルトの名無しさん
07/08/11 22:50:43
次スレからタイトルを実際に即して「RubyとPythonとLisp Scheme」にしろよ

968:デフォルトの名無しさん
07/08/11 23:24:48
>>965
「大抵の人」は「Rubyのほうが読みやすいと思う」んだろ?まぁ、普通にそうなんじゃね。

その手の話は腐るほど見てきてるし、そう思う気持ちもわからんではないが、
何度も何度も同じ話を聞かされてるんで食傷気味。Matz が同じようなこといってるから
Matz 日記でやると同志がいっぱいいると思うよ。



969:デフォルトの名無しさん
07/08/12 00:05:09
CRANがそれだろ。lispは実用のみ

970:デフォルトの名無しさん
07/08/12 00:42:49
>967
夏だからだよ

971:デフォルトの名無しさん
07/08/12 00:51:41
CLだとガード節相当はreturn-from 関数名とかで書けるけど
schemeだとやっぱ継続?

972:デフォルトの名無しさん
07/08/12 01:01:57
サマースクールモードなのか

973:デフォルトの名無しさん
07/08/12 01:07:08
>965
Rubyは間違いなく読みやすい部類だよ。
ただ、パーザの挙動が判りづらいから
読んだ通りの動きになってくれてるとは限らないところが落とし穴。

Lisp系のパーザの挙動は見たままだろうw

974:デフォルトの名無しさん
07/08/12 01:42:01
>>971
(define-macro (return-from% name . result) `(,name ,@result))
(define-macro (block% name . body) `(call/cc (lambda (,name) ,@body)))
(define-macro (define% name . body)
(if (symbol? name)
`(define ,name (block% ,name ,@body))
`(define ,(car name)
(block% ,(car name) (lambda ,(cdr name) ,@body)))))

(define% (test1 x)
(if (not (number? x))
(return-from% func #f))
x)

;;
(test1 1) => 1
(test1 'a) => #f
まあ、つまり見たまま。

975:デフォルトの名無しさん
07/08/12 01:43:39
(return-from% test1 #f))
だった。
おれには衛生的なやつは無理。

976:デフォルトの名無しさん
07/08/12 01:48:46
(define% test2
(lambda (x)
(if (not (number? x))
(return-from% test2 #f))
x))

(test2 1) => 1
(test2 'a) => #f
うむ、ちゃんと動いてるな。
ただ、これだと普通の再帰ができなくなる。
nameを加工するかしないと。

977:デフォルトの名無しさん
07/08/12 02:07:48
>>974
(define test1
(call/cc (lambda (test1)
(lambda (x) (if (not (number? x)) (test1 #f)) x))))

これって継続呼んだ時点でdefineの束縛フェーズに戻って
test1が継続の返り値に書き換わるんじゃない?

978:デフォルトの名無しさん
07/08/12 02:17:19
>>968
例えば他の言語ならifの中で束縛を使いたいならifのスコープをその束縛のスコープとして適用して簡略化する
lispの場合はifをletでくるむ形で束縛のスコープを設定する
これはifのスコープとは別に束縛のスコープを記述できる分表現力は高いがネストが深くなり見た目も多少複雑になる

別にlispを全否定している訳じゃ無いしその分lispは力を得ることがで来ていると思う
ただ他の言語より可読性が高いとは思わない

>>973
人間コンパイラきたーw

979:デフォルトの名無しさん
07/08/12 02:26:02
return関係はshiroさんのが理解しやすい
URLリンク(practical-scheme.net)

言語としてreturnが用意してあるのとreturnを作れるのは意味合いが違ってくると思う

980:デフォルトの名無しさん
07/08/12 02:40:53
>>977
あー間違った。call/ccをlambdaの中に入れといて。
どっちみち不完全だけどさ。

981:デフォルトの名無しさん
07/08/12 02:59:57
>>978
他のスレでやれば賛同者多数だと思うんだがね。
このスレに自分の意見に賛同しない人がいる限りとかいったら延々とネストだの括弧だのって話を繰り返す気なのか?

982:デフォルトの名無しさん
07/08/12 03:03:27
そういう意味のないレスならしないほうがいい

983:デフォルトの名無しさん
07/08/12 03:07:26
元ネタからして意味がないので続かなくていいよ

984:デフォルトの名無しさん
07/08/12 03:30:04
反応が小学生だなw

985:デフォルトの名無しさん
07/08/12 03:34:02
相手が小学生レベルだからな。

986:デフォルトの名無しさん
07/08/12 03:39:44
Gauche本、まだ出ないのかなぁ

987:デフォルトの名無しさん
07/08/12 04:28:33
なんか伸びてると思ったらいつもの話題か。

988:デフォルトの名無しさん
07/08/12 04:44:03
可読性、最強言語選手権、黒板
の三本立てでこのスレは成り立っています。

989:デフォルトの名無しさん
07/08/12 05:23:35
次スレよろ

990:デフォルトの名無しさん
07/08/12 19:28:21
それなりに言っていることはわかる
慣れれば気にならなくなるが可読性が高いわけじゃないからな
というか誰かLispの可読性が高いなんて言ったっけ?

991:デフォルトの名無しさん
07/08/12 20:04:49
少なくとも俺には可読性高い。(ちゃんとインデントされていれば)
他の人間のことは知らんし、あまり興味無い。

992:デフォルトの名無しさん
07/08/12 20:15:00
インデントがあれば括弧はいらない!

993:デフォルトの名無しさん
07/08/12 20:26:41
比較する条件次第、という面がLispは特に強い気はする。
インデントをいったんすべて無くして、エディタの力を何も借りられない条件下で
「さあ把握してみろ」みたいな勝負なら、そりゃあもう大惨敗だけど、
その両者がきちんと揃うと、途端に「そう一方的に負けてるもんでもない」って位置へ上がる、みたいな。
まぁ、客観的な話ではないけれども。

994:デフォルトの名無しさん
07/08/12 21:07:56
括弧が多いと Emacs でカーソル移動が楽になる

995:デフォルトの名無しさん
07/08/12 21:10:20
インデントの話が出たんで、ちょっと質問なんですが、
Emacs + slime-mode で loop のインデントが次のようになります。

(loop as n = (progn (format t "~&Number: ")
(parse-integer (read-line) :junk-allowed t))
while n
do (format t "~&The square of ~D is ~D.~%" n (* n n)))

これを下のようにするには、どう設定すれば良いでしょうか?

(loop as n = (progn (format t "~&Number: ")
(parse-integer (read-line) :junk-allowed t))
while n
do (format t "~&The square of ~D is ~D.~%" n (* n n)))


996:デフォルトの名無しさん
07/08/12 21:38:59
立てといた
Lisp Scheme Part18
スレリンク(tech板)


>>995


997:デフォルトの名無しさん
07/08/12 21:43:56
結局インデントで見ているんじゃPython批判できないじゃん

998:デフォルトの名無しさん
07/08/12 22:11:05
>>997
つかPythonも好きな奴多いと思うけど。

lambda埋め

999:デフォルトの名無しさん
07/08/12 22:50:37
でもRubyは嫌い

1000:デフォルトの名無しさん
07/08/12 22:55:37
1000ならロト6で1等当選

1001:1001
Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch