5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

Lisp Scheme Part36

1 :デフォルトの名無しさん:2013/03/13(水) 19:50:42.79
Common Lisp、SchemeをはじめとするLisp族全般のスレです

■前スレ
Lisp Scheme Part35
ttp://toro.2ch.net/test/read.cgi/tech/1348018916/

■テンプレ
ttp://wiki.fdiary.net/lisp/

■関連スレ
【入門】Common Lisp その10【質問よろず】
ttp://toro.2ch.net/test/read.cgi/tech/1361341876/
【Scheme】Schemeインタプリタ Mosh Part1【Lisp】
ttp://toro.2ch.net/test/read.cgi/tech/1272469779/
【Lisp】プログラミング言語 Clojure #2【JVM】
ttp://toro.2ch.net/test/read.cgi/tech/1318498898/
【魔法】リリカル☆Lisp【言語】
ttp://toro.2ch.net/test/read.cgi/tech/1183396621/

938 :はちみつ餃子 ◆8X2XSCHEME :2013/08/27(火) NY:AN:NY.AN
いいえ。
でも、 Scheme で書いてもそれほど難しくはなさそうだね。

939 :デフォルトの名無しさん:2013/08/27(火) NY:AN:NY.AN
(setq sexps (loop repeat 1000000 collect (loop repeat 6 collect (random 10))))
(setq nums (loop repeat 1000000 collect (random 1000000)))

(defun uniq-num (lst)
(time
(let ((hash (make-hash-table :size 1000000 :test #'equal)))
(dolist (x lst)
(setf (gethash x hash 0) t))
(hash-table-count hash))))

(uniq-num sexps)
(uniq-num nums)

0.395 seconds of real time :test #'eq num
2.168 seconds of real time :test #'equal num
6.937 seconds of real time :test #'equal str
54.463 seconds of real time :test #'equal sexp

940 :939:2013/08/27(火) NY:AN:NY.AN
私は100万個のS式から重複を削除したいです。
remove-duplicateでは処理が終わらずhash-tableを使うことにしました。
上の式を実行すると 54秒で処理を終えることが出来ました。

しかしhash-tableを:test #'eqにしランダムな数値を100万個入れた所0.4秒で終わりました。
比較関数の違いで100倍も違うのか疑問に思い:test #'equalに変えてみた所2.1秒でした。
S式の場合は何故こんなに遅いのだろうと、試しに
(setf (gethash (format nil "~a" x) hash) t)としてみると6.9秒で済ますことが出来ました。

もっと早く重複を削除することは出来ないでしょうか?お知恵を拝借させてください。

941 :はちみつ餃子 ◆8X2XSCHEME :2013/08/27(火) NY:AN:NY.AN
Common Lisp についてはよく知らないけど、
数値を入れる場合なら比較関数として eq を使うと正しい結果にならないんじゃね?

942 :デフォルトの名無しさん:2013/08/27(火) NY:AN:NY.AN
自然結合する関数があった気がする

943 :デフォルトの名無しさん:2013/08/27(火) NY:AN:NY.AN
高速RDBMSを使うという裏ワザもある
格納の時間を無視するなら、100万でも1秒かからない気がする

944 :デフォルトの名無しさん:2013/08/28(水) NY:AN:NY.AN
適材適所

945 :デフォルトの名無しさん:2013/08/28(水) NY:AN:NY.AN
2chやばいから
したらば
あたりに移動できないものかな
Gaucheのサイトの中に2chのcgi動かしてくれる場所あれば
一番いいのだけど

946 :デフォルトの名無しさん:2013/08/28(水) NY:AN:NY.AN
racket の dict-refならhashもalistも自動切り替えしてくれるよ

947 :はちみつ餃子 ◆8X2XSCHEME :2013/08/28(水) NY:AN:NY.AN
>>945
WiLiKi や Chaton があるんだから質問系はそっちに書けばいいじゃん。
ただ、 2ch くらいはっちゃけられる場所は欲しいよな。

ゆるく雑談しながらダベる場所としては IRC もあるぞ。
freenode の #Lisp_Scheme だ。
ずっと過疎っぱなしで寂しいのでみんなも来てくれよな!

948 :939:2013/08/28(水) NY:AN:NY.AN
みなさんレスありがとうございます。
この重複削除の時間が10分の1にさえなればプログラム全体に大きな影響を与えられます。
ダーティハック的な手法さえ許容し高速化できないものでしょうか。

>>941
はい、eqはオブジェクト同一性による比較であり同じ数値が違うオブジェクトである可能性がある為eqlを使うべきでした。

>>942
lisp 自然結合 等で検索しても見つけることができませんでした。どのような処理をする関数なのでしょう(lisp内部にDBを作る?)。

949 :939:2013/08/28(水) NY:AN:NY.AN
>>943
>格納の時間を無視するなら、100万でも1秒かからない気がする
御免なさい格納の時間とは何を指しているのでしょう。
(setf (gethash x hash) t)) の処理時間の事を示すのであれば
現在の場合も格納を無視した時間は格納時間に比べ微である様に思います。

>>946
racketは型に応じて処理を切り替え、重複削除が高速に行えるということでしょうか。
今回はCLで書いている為残念ながら利用できませんが良いですね!

950 :はちみつ餃子 ◆8X2XSCHEME :2013/08/28(水) NY:AN:NY.AN
>>946 >>949
Common Lisp にも aref があるじゃん。

951 :939:2013/08/28(水) NY:AN:NY.AN
>>950
ありますがどう使えと・・?

952 :はちみつ餃子 ◆8X2XSCHEME :2013/08/29(木) NY:AN:NY.AN
さあ。
とりあえず同等のものがあるから言ってみただけ。

953 :デフォルトの名無しさん:2013/08/29(木) NY:AN:NY.AN
>>949
格納の時間は、たぶんデータベースを使うならそのデータベースに登録するのにかかる
時間ということでしょう
まあ、100万レコード登録するとかなり時間かかるんじゃないかと思うけど

954 :デフォルトの名無しさん:2013/08/29(木) NY:AN:NY.AN
S式の部分を、できるならvectorとかにしたらどうかな?

955 :デフォルトの名無しさん:2013/08/29(木) NY:AN:NY.AN
eval と apply の違いがいまいち分かりません

956 :デフォルトの名無しさん:2013/08/29(木) NY:AN:NY.AN
eval - S式を評価する
apply - 関数に引数を適用する

957 :デフォルトの名無しさん:2013/08/29(木) NY:AN:NY.AN
「引数に関数を」の間違いだ

958 :デフォルトの名無しさん:2013/08/29(木) NY:AN:NY.AN
evalはS式ならなんでもいい(マクロも展開する)
applyは関数しか適用できない

959 :デフォルトの名無しさん:2013/08/30(金) NY:AN:NY.AN
schemeってS式と関数は別物なのだろうか

960 :デフォルトの名無しさん:2013/08/30(金) NY:AN:NY.AN
関数はatomだからS式だよ。
簡単にevalを書ける例の表現ではないけど。

961 :デフォルトの名無しさん:2013/08/30(金) NY:AN:NY.AN
scheme界のニューアイドル、naoiwataをこれからもよろしく!
困ったときは泣いている顔文字でアピールしてくるので、お前らちゃんと助けてやれ

962 :はちみつ餃子 ◆8X2XSCHEME :2013/08/31(土) NY:AN:NY.AN
そうか。

963 :デフォルトの名無しさん:2013/08/31(土) NY:AN:NY.AN
R7RSに準拠するつもりでオレオレ処理系作ってます
複素数のsinってどうやるんだっけ?とかwikipedia先生に聞きながらちまちま実装してる今日このごろです
で本題なんですが + - * / の可変長引数版は引数を fold すればいいと思うんですが
= < <= > >= の可変長引数版を実装するのになんかいい高階関数とかないでしょうか

964 :デフォルトの名無しさん:2013/08/31(土) NY:AN:NY.AN
悩んでるときに「大丈夫?」って声かけられたとして。
相手が男もしくは利用価値のありそうなプログラマの場合は「だいじょぶです(;;)」
相手が女の場合は「大丈夫^^」ってレスする女のこと、Lisperの皆さんはどう思われますか?

965 :デフォルトの名無しさん:2013/08/31(土) NY:AN:NY.AN
男と女、または上位の人間と対等な人間
それらに対する反応をナチュラルに使い分ける腹黒い女は、僕はどうかと思いますね

966 :デフォルトの名無しさん:2013/08/31(土) NY:AN:NY.AN
なんか人としてどうしようもないのがわきはじめたオワタ

967 :はちみつ餃子 ◆8X2XSCHEME :2013/08/31(土) NY:AN:NY.AN
>>963
比較関数の場合でも持ち回る値の数は一個でよくて、但し、途中で脱出する場合がある。
Scheme では第一級継続のおかげで大域脱出が簡単に書けるので、こんな風に書ける。

(define (< arg1 . rest)
(call/cc
(lambda(cc)
(fold (lambda(elt acc) (if (<2 acc elt) elt (cc #f))) arg1 rest)
#t)))

ここでは <2 っていうのが二引数版の < ってことね。
この程度のものに継続を捕捉するのが非効率だということであれば、
何かの特別な値が発生したときにその場で脱出するような機能をもった fold を作ればいいと思う。

968 :デフォルトの名無しさん:2013/08/31(土) NY:AN:NY.AN
>>963
処理系はマクロを廃止して仕様をコンパクトにしてダウングレードしたバージョンを作ってくれないでしょうか

969 :デフォルトの名無しさん:2013/08/31(土) NY:AN:NY.AN
Schemeからマクロ抜いてどうすんの

970 :デフォルトの名無しさん:2013/08/31(土) NY:AN:NY.AN
分岐(if, cond)とシリーズ(begin)と関数作成(lambda)とデータ化(quote)と例外処理(try, with)までは認めよう
他のマクロはいらない
set!もいらない

もっと純粋さを追及してみてはどうか

971 :デフォルトの名無しさん:2013/08/31(土) NY:AN:NY.AN
letもいらない? lambdaでがんばるのか... 大変そうだ
例外はマクロでなくてもいいかと

972 :デフォルトの名無しさん:2013/08/31(土) NY:AN:NY.AN
もうskiコンビネータ使ってプログラム書けばいいじゃん

973 :デフォルトの名無しさん:2013/08/31(土) NY:AN:NY.AN
妙なカキコがあると思ったら今日は中高生の休み最後の日か

974 :デフォルトの名無しさん:2013/08/31(土) NY:AN:NY.AN
マクロってLisp最後の砦じゃないの

975 :デフォルトの名無しさん:2013/08/31(土) NY:AN:NY.AN
ClojureもCommonLispも単独スレあるしつぎからSchemeスレにしてほしい

976 :デフォルトの名無しさん:2013/08/31(土) NY:AN:NY.AN
macro無くすならfexpr復活させようぜ?w

977 :デフォルトの名無しさん:2013/08/31(土) NY:AN:NY.AN
マクロ無くせというよりも、自作処理系作るならマクロなしバージョンで洗練させてみてはどうかという提案
その方が簡単だし、プログラミングするときに技術的な挑戦が存在する

978 :デフォルトの名無しさん:2013/08/31(土) NY:AN:NY.AN
>>977
技術的な挑戦をしたいのなら、>977自身が挑戦的なオレオレ処理系を作ればいいのではないかと

979 :デフォルトの名無しさん:2013/08/31(土) NY:AN:NY.AN
俺々処理系作ったことのある身から言うとマクロ無いほうが
ゴリゴリ決め打ち処理書けるので楽|雑にかける

980 :はちみつ餃子 ◆8X2XSCHEME :2013/09/01(日) 00:02:11.48
書いてる内にその自作処理系でコンパイラを書きたくなり、
ブートストラッピング的なことをするときにマクロがないとつらたん。
という理屈でやっぱりマクロが欲しくなるものらしいけどね。

とりあえず必要なところから書いていけばいいんじゃないの。
マクロが要るようなら導入すればいいし、要らないなら後付けでいいじゃん。
うまく後付けできなくて最初から書き直しなんてのもよくあること。

981 :デフォルトの名無しさん:2013/09/01(日) 01:21:25.46
>>980
次スレよろしく

982 :はちみつ餃子 ◆8X2XSCHEME :2013/09/01(日) 01:52:09.17
立てたよ。

Lisp Scheme Part37
http://toro.2ch.net/test/read.cgi/tech/1377967896/

983 :デフォルトの名無しさん:2013/09/01(日) 13:56:58.49
おつかれー

984 :デフォルトの名無しさん:2013/09/01(日) 19:51:27.12
>>982
誤爆www

985 :しょしんしゃ ◆/DG0Jy/HnA :2013/09/02(月) 10:29:09.39
体調悪いアピールしてもいい?

986 :デフォルトの名無しさん:2013/09/02(月) 10:55:40.66
プログラマ板でしてね

987 :しょしんしゃ ◆/DG0Jy/HnA :2013/09/02(月) 11:17:23.06
>>986
しょしんしゃなのでプログラマじゃないです

226 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)