【入門】Common Lisp その8【質問よろず】

このエントリーをはてなブックマークに追加
942はちみつ餃子 ◆8X2XSCHEME :2012/02/28(火) 13:12:24.80
あれ、ちょっと言葉が足りてない気がするので補足。

実際問題、末尾再帰の最適化が出来ない処理系なんて稀だし、
それを言ったら C/C++ でも主要な処理系は末尾再帰最適化するので、
再帰の話で C/C++ と Lisp を比べるのは意味ないんじゃねーの?

既に >>940 が述べた通り、 Lisp では仮に再帰やループを使う場面でも
それを抽象化した関数なりマクロなりを使うことが多い。
そしてそういった「抽象化」が出来るところが何より Lisp の優位性だと思ってる。

もちろんどんな言語でも抽象化のための機構はもってるんだけど、
Lisp は粒度が細かいとでもいうか、小さい単位で抽象化するよね。
(それにはデメリットもあるのでそれが良いとか悪いとかじゃなくて、
Lisp の方が向いている場面もあるという意味で。)

それとインクリメンタルな開発プロセスも Lisp の特徴なので、
出来上がったコードで差が無いように見えても C/C++ でもよかったとは限らない。
943デフォルトの名無しさん:2012/02/28(火) 13:42:23.27
というか、何のためにLisp総合スレとCLスレが分かれてるんだかわからん展開だな
944デフォルトの名無しさん:2012/02/28(火) 13:43:07.23
Lispは手続き型やオブジェクト指向の言語とは全く違う感覚で書く。
書いたコードはREPLでその場で実行修正、ソフトのためのライブラリを書くボトムアップ、副作用はなるべく一部に閉じ込める、高階関数で汎用部品を組み合わせる、マクロで関数で不可能な抽象化を行なう等。
CやC++と同じ感覚で書くと真価が掴めない。どの言語でもその言語に適したスタイルを身につけないとダメ。
945デフォルトの名無しさん:2012/02/28(火) 13:49:48.10
マクロで書く関数では不可能な抽象化とは具体的にどういった物でしょうか?
946デフォルトの名無しさん:2012/02/28(火) 18:26:49.38
他の言語では言語の機能、文法として提供されている抽象化等。
947デフォルトの名無しさん:2012/02/28(火) 18:36:20.87
他もにDSLを作って簡単な宣言からプログラムを自動生成したり、コードの内部にxmlを埋め込んでプログラムを自動生成したり。
sxmlからGUI用のコードを生成するとか、他の言語だとIDEが吐くスケルトンも言語内で抽象化出来る。
948デフォルトの名無しさん:2012/02/28(火) 18:47:42.71
Let over Lambda とか On Lisp とか Practical Common Lisp を見ろ、とか言ってもどうせステマ乙、
で済まされるかもしれないが一応言っておく。
949デフォルトの名無しさん:2012/02/28(火) 19:11:52.69
>>945
> マクロで書く関数では

えーと…何といいますか…
950デフォルトの名無しさん:2012/02/28(火) 20:04:41.53
マクロで関数で不可能な抽象化を行なう等。を、マクロの関数で読み違えてるんじゃないか?での連続だから。
関数で不可能な抽象化をマクロで行なう等。 ということだな。分かりやすくすれば。
951デフォルトの名無しさん:2012/02/28(火) 20:47:48.40
えと、ここ入門スレですよね
952デフォルトの名無しさん:2012/02/28(火) 21:02:02.87
>>945

良く引き合いに出される例だけど
if test then
true-case
else
false-case
fi
これが, 関数 if だと
if(test true-case false-case)
と, なってしまう. このため,

1. 遅延評価を前提としてない言語だと test が返した結果にも関わらず,
true-case とfalse-case が実行されてしまう
2. true-case アンド/オア false-case に副作用があった場合, if 式の結果
が保証されない

マクロは ``クロ内で積極的に評価しない限り引数は評価されない'' ので上記
のよ うな問題は発生しない

てな所か?




953デフォルトの名無しさん:2012/02/28(火) 22:56:46.88
>>951
入門スレだけどCommon Lisp限定の話なら話の高度さに関係なくスレは進むよ
Macroについての入門だったり、高階関数の入門だったりと初めての事が出てくる話ならなんでも入門さね
954デフォルトの名無しさん:2012/02/29(水) 01:26:32.99
マクロはリストを返す関数だけど、
返すリストがコードとして実行時に再度評価される?
955デフォルトの名無しさん:2012/02/29(水) 01:41:40.89
はい、そんなところです。
956デフォルトの名無しさん:2012/03/01(木) 02:16:16.45
>>941,942
schemeだかgaucheの中の人の記事にschemerは再起使うのが普通ってあったんだが
いや実際、使ってなかったから使わないのが普通なんだろうけど、
再起、末尾再帰なんて黒板問題でしか出てこないもんなのか?

>>944
TDDなんてREPLみたいなものじゃないの?

インクリメンタルな開発なんていうけれど、
要求分析が出来てない状況での開発にOOPが向いてないだけだよね?
ゲロゲロなオブジェクトの山になる前に、ただのcで書けってだけで。
957デフォルトの名無しさん:2012/03/01(木) 02:44:26.98
>>956
schemerとCLerは大幅にスタイルが違う。schemeなら再帰が普通。
TDDは方針、replはそれを支えうる機能。TDDにも使えるけど他の用途にも使える。
関数単体での実行が出来るし、変数も弄れる。作った関数をその場で確認しつつ修正していくスタイルは楽。コンパイルを通すためだけのコードも書かなくて良い。
高階関数やマクロはCより粒度の小さい部品が作れる。汎用的で小さな部品を組み合わせるのが関数型のスタイル。汎用だから仕様の変更にも強い。

どちらかというとLispSchemeスレ向きの話題になりつつあるな。
958デフォルトの名無しさん:2012/03/01(木) 02:54:17.39
欠点は動的型なのでテストが面倒な点と、自由度が高いので馬鹿が入ると酷い目に会う点かな。
部品の粒度が小さいし、実装と機能を分離させるし、動的型だし、マクロ等で無茶が出来るしで、特に決断を後にする、考えながら書くのに向く。
静的型以外の言語の機能なら簡単に後付け出来る。言語としての制約はないに等しい。どんな問題を解決すべきかも分からない研究等には最適。
959デフォルトの名無しさん:2012/03/01(木) 03:02:22.06
500行程度のcのコードで情報学科の教授は勤まるがな
960デフォルトの名無しさん:2012/03/01(木) 03:39:40.73
>>956
サンプルが偏ってるんじゃないかな。マクロとか普通に再帰を使いまくりだよ。
木構造であるプログラムのコードを扱うのがマクロなわけで、木構造と再帰の関係はご存知の通り。
また、再帰と同類の再帰的なマクロ定義も常套手段だし、やっぱり再帰とは切っても切れない関係。

マクロに限らずとも、例えば多値を使う場面では再帰を使うことが多い。
これは多値と標準のループ構文の相性が悪いから。

再帰を使う以上、メリットがあるなら最適化される末尾再帰にもするし、
再帰が不要ならdoやloopといったループ構文で済ませたりもする。要は使い分け。

それと、Common Lispはマルチパラダイムなので、書く人によって本当に全然スタイルが違う。
例えば、SchemeやHaskellも使う人なんかはモダンで関数的なコードを好んで書くけど、
歴史のある処理系のコードなんかは代入も使いまくりで実に手続き的だったりする。
この辺りは、色々な人の色々なコードを読んでみないと実感できないと思う。
961デフォルトの名無しさん:2012/03/01(木) 04:03:57.92
具体的な例も知りたいだろうから、とりあえず目に付いた、普通に再帰を実用してる例。

http://lib.store.yahoo.net/lib/paulgraham/utx.lisp
http://www.flownet.com/ron/lisp/rg-utils.lisp
962デフォルトの名無しさん:2012/03/01(木) 13:07:10.67
パッケージの機能がいまいち飲み込めないです
パッケージを切り替えるときに
common lisp内部ではどういう処理をしているのですか
963はちみつ餃子 ◆8X2XSCHEME :2012/03/01(木) 13:18:12.78
一応補足しておくけど CL で「積極的に再帰を使うような風土はありません」と書いたのは、
単純なループのかわりとか、なんでもかんでも再帰というわけではない、
という程度の意味であって全く使わないという意味じゃないよ。

Scheme の場合には破壊的な更新をすると第一級継続との組合せがやりにくいとかいうのも理由にあるかも。
964デフォルトの名無しさん:2012/03/01(木) 16:10:19.00
>>962
「環境」が変わります。
ネームルックアップテーブルを切り替えるわけです。
965デフォルトの名無しさん:2012/03/02(金) 00:45:20.38
WEB+DBの最新号、関数型言語入門を山本和彦が書いてるのを立ち読みして来た
けど、LISPに関する文章が悲しくて泣けた
966デフォルトの名無しさん:2012/03/02(金) 00:51:53.53
いや、こっちにまで出張してこなくて良いから。
967デフォルトの名無しさん:2012/03/02(金) 01:32:56.02
どんな文章だった?
968デフォルトの名無しさん:2012/03/02(金) 01:34:37.39
Lisp Schemeスレ見れ
969デフォルトの名無しさん:2012/03/02(金) 18:36:47.70
c++学んだ後にjavaを覚えて、オブジェクト指向についてわかってなかった
っていうようなもんじゃねーの?
970デフォルトの名無しさん:2012/03/02(金) 19:01:10.30
素人だし仕方ない。
971デフォルトの名無しさん:2012/03/02(金) 20:19:45.49
俺がわからなかったからおまいらもわかってないよな?
みたいな売り込み方はなあ・・・
972デフォルトの名無しさん:2012/03/02(金) 20:55:02.24
言語とは畑違いの雑誌に素人が書いた素人向けの記事だからそれでいいんじゃないの?
973デフォルトの名無しさん:2012/03/02(金) 23:27:36.37
一件落着
974デフォルトの名無しさん:2012/03/03(土) 15:18:08.54
あの人素人なのか?
975デフォルトの名無しさん:2012/03/03(土) 16:01:37.61
日本を代表するhaskell hackerだろ
書いたコードの経歴も調べられない素人>972
976デフォルトの名無しさん:2012/03/03(土) 18:02:01.29
seriesは実際の現場では使われているのでしょうか。
CLtL2の付録に載っていて、ファイルの入出力がとても手軽でいいなとは思うのですが
with-open-fileマクロを使うのがやはり主流なのかなと思いますが。
気になったので聞きました。
977デフォルトの名無しさん:2012/03/03(土) 23:51:11.18
kazuさんのこともしらない人ってなんなの
978デフォルトの名無しさん:2012/03/04(日) 00:02:59.74
このスレをそういうので埋める気?
それだったら980あたりで次スレお願いね
979デフォルトの名無しさん:2012/03/04(日) 00:39:55.69
何仕切ってんだよクズ
980デフォルトの名無しさん:2012/03/04(日) 21:38:04.39
>>976
他にレスが付かないから、そんな詳しくないけどレス。おそらくは主流じゃない。
Series使ってる人はふたり知ってるけど、自分が読む範囲のコードでは見掛けない。
ただ、表に出てこないだけで、ある所にはあるのかもしれない。自分も知りたい。

CLtL2でSteeleの書いてる通りなら、実績に裏打ちされたものではあるんだろうから、
これ使って良いのかな、って話なら、気にせず使っちゃえって思うな。
自分もSeriesのアプローチは好き。
981デフォルトの名無しさん:2012/03/04(日) 21:56:07.87
このスレの頭で話が出てたけど、次スレの>>1、こんなんで良い?

Lisp Schemeスレでは恥ずかしくて聞けないようなことを質問したり、
Lisp Schemeスレの話題は高度すぎて気後れする人が話しあったり。
それ以外でもCommon Lispについての話題なら歓迎します。

ま、ゆっくりやりましょう。

「いいものの本質は、いかなる時代においても変わらない」byパワーズ

■前スレ
【入門】Common Lisp その8【質問よろず】
http://toro.2ch.net/test/read.cgi/tech/1309940115/

■Wiki
http://wiki.fdiary.net/lisp/ (id:guest pass:cl)
http://cl.cddddr.org/
http://tips.lisp-users.org/common-lisp/
982デフォルトの名無しさん:2012/03/04(日) 22:43:00.13
いいと思うよ
983デフォルトの名無しさん:2012/03/05(月) 00:18:38.80
>>977
>>979
こういう信者がいるような人の言うことって当てにならないよね
984デフォルトの名無しさん:2012/03/05(月) 00:20:43.91
本人も迷惑だろうな
985デフォルトの名無しさん:2012/03/05(月) 00:24:34.11
> kazuさん

きめえwwwww
986980:2012/03/05(月) 04:08:27.32
立ててきたよー。

【入門】Common Lisp その9【質問よろず】
http://toro.2ch.net/test/read.cgi/tech/1330888006/
987デフォルトの名無しさん:2012/03/05(月) 11:05:50.80
>>983-985

連投するから基地外が一人で必死だとバレバレですよwwwwwwwwww
988デフォルトの名無しさん:2012/03/05(月) 14:29:53.69
↑ここまで自演
989デフォルトの名無しさん:2012/03/05(月) 17:52:52.04
↑ここまで自粛
990デフォルトの名無しさん:2012/03/05(月) 23:47:50.04
↑ここで再帰




と思いきや、継続↓
991はちみつ餃子 ◆8X2XSCHEME