Lisp Scheme Part40 [転載禁止]©2ch.net
レス数が1000を超えています。これ以上書き込みはできません。
:optional引数ってどうやって指定するんですか(?_?) Scheme でオプショナル引数を受け取る手続きをどう書くか? という意味? オプショナル引数を受け取れる手続きにどうやって渡すかという意味でつ それって聞かなきゃわからんような要素あるか?
普通に引数を書く以外にすることないだろ。 はちみつ餃子 ◆8X2XSCHEME怒らせたら大したもんやで (apply オプショナル引数付き関数 (list 引数))
こうです Lisp勉強するのに、白と黒の扉、聖霊の箱って役に立つ? >>834
amazon でみたところ、「白と黒の扉」とかは、オートマトンやチューリングマシンの話だから lisp とはあまり関係ないんじゃないかな?
いや、 lisp でオートマトンやチューリングマシンを記述したいのだったら話は別だが
この手の話は、私は手元に
https://www.amazon.co.jp/dp/4627805500/
を置いて逐次参照しています、チューリングマシンの適当な発展書があれば、教えていただけるとうれしい >>834
そういう目的には合ってないと思う
ある程度知ってる人が読みものとして楽しむもの もねまね鳥をまねる
スマリヤン先生って去年亡くなってたのか
120歳まで生きると思ってた スマリヤンって関西っぽい響きがあるよね。
スマリやん?www >>839
あれはチューリングマシンじゃなくてコンビネータ >>840
ああっ昔駄洒落自動生成機を作ろうとした黒歴史を思い出した すまん。初心者です。教えてください。
仮に学校の比較?などを扱うプログラムを作ろうとしていて、schoolという1つの学校の情報をまとめたクラスを作るとします。
そのクラスの中に、以下のような学生の情報をまとめたテーブルの情報をぶち込みたいとして、どのようにこれらのテーブルをschoolクラス内に保存するのがいいですか。
名前 整理番号 性別 2ちゃんねら 馬鹿 橋本環奈好き 年齢
taro 0 #\M t t nil 16
hanako 1 #\F nil t t 16
nagisa 2 #\L nil nil t 18
hoge
piyo
foobar
...
学校によって人数は若干違いますが、基本的にテーブルの大きさはそれほど大きくないとします。
それぞれの要素を頻繁に検索・参照する必要があります。
僕が思いつくのは、
・schoolのstudentsというスロットに、1人のデータの1つのリスト・構造体・クラスにして、そのリストとして保存。
・ハッシュテーブルをつかって、下記のような形で保存。
2CHP ((NAGISA NIL) (HANAKO NIL) (TARO T))
BAKAP ((NAGISA T) (HANAKO T) (TARO T))
ぐらいなのですが、このうちどれがおすすめとか、これら以外にもっと便利な方法などありましたら教えてください。
よろしくお願いいたします。 作ったハッシュテーブルをschoolのstudentsスロットにぶち込むと言うことです。
あと、nagisaさんは馬鹿ではありません。失礼しました。
こーいうクラスとかの設計の基本と言うか定石ってどうやって勉強したらええの? 何が良くて何が悪いかなんてやってみなきゃわからんよ。
まず動くものを作ってから出来が悪いと思ったところを直していったらいい。
LISP の良さってそういうとこだろ。 studentクラスの定義がまず先かな
あとstudentsはキーを何にするかが問題
多分名前なんだろうけど、他の項目でも取り出したいときはハッシュテーブルだと面倒だから単に配列でも良いと思うがな >>843
そもそもクラスは初心者向きじゃないし
Lispのような関数型言語では無理に使わなくても別にいい
多用したいならオブジェクト指向言語を使えばいい オブジェクトシステムを積極的に使うべきかどうかは確かに場合によるし使わなくても割といけるが、
関数型とオブジェクト指向は直行する概念で、関数型であるからオブジェクトシステムの価値が低いというわけじゃない。 CLOSは初心者に分かりにくい
Lisp自体もそうだけどさらに分かりにくい CLOSみたいなんじゃなくてもっと言語仕様に密着したオブジェクトシステムがあればと思う
例えばコンスセルはcarとcdrをメンバーに持つクラスみたいな
Gaucheってそうなってんだっけ? オブジェクト志向うんぬんの空気読まずにカキコ
>>844
>こーいうクラスとかの設計の基本と言うか定石ってどうやって勉強したらええの?
LISPというよりも、どちらかというとデータベース設計が主題になるね
もし手早くSchemeで小規模なデータベースを実装したいのであれば、
SLIBと呼ばれるよく知られたライブラリに含まれている
データベースを使うのが最短だと思う
・The SLIB Portable Scheme Library
http://people.csail.mit.edu/jaffer/SLIB
日本語では、以下の書籍で文献データベースを主題として丁寧に解説されている
・入門Scheme
- Schcme入門からXツールキットを使ったリレーショナルデータベースプログラムまで
https://www.amazon.co.jp/dp/4879669547
もしLISP(による実装)を離れて一般的なデータベース設計そのものを勉強するなら、
たとえば定番の入門書(教科書)である以下の書籍の前半を読む
・リレーショナルデータベース入門―データモデル・SQL・管理システム・NoSQL
https://www.amazon.co.jp/dp/4781913903
もしLISPプログラミングに自信があり、その上で広義のデータベースとして
「LISPによる知識表現プログラミング」を習得したいのなら、
遠回りになるけどSICP本の「4.4章 論理プログラミング」への挑戦を勧める
>>849
どうだろうなぁ。 初心者っていうか人によるんじゃね。
俺は JavaScript のプロトタイプベースのクソさに辟易した (実利があるのはわかってはいる) けど、
Gauche の (CLOS 風の) オブジェクトシステムにはそんなに忌避感ないし。 みなさん、アドバイス・参考書の紹介などありがとうございます。
いろいろ自分で試してみて、どれがいいか決めようと思います。
とりあえずの方針としては、school-baseみたいなクラスの下に、studentsクラスを作って
そこにテーブル属性ごとにスロットを作って、alist形式でぶち込むことにしました。
キーの設定やら検索の便宜やら考えた結果、alistが一番手軽そうだと言うことで。
BAKAP ((taro.t) (hanako) (nagisa.t) ... )
みたいな感じで。学生を単位にデータを作ると扱いづらそうなので。 オブジェクト指向的には
学生ごとにインスタンスを生成して
各属性はインスタンスのスロットに入れるのが自然な実装だろう
属性が動的に変わるなら
そこをalist/plistにするか
プロトタイプ思考のOOPSを使うといい 本屋に行ったらLittle Proverの和訳が出ててびっくりした またkaizenさんが和歌でレビュー書いてるのかと思った 教えてください。
cxmlで150mbぐらいのファイルをparseしようとしたら、
メモリのリミット来てるでーって怒られてダメでした。
巨大ファイルの扱い方教えてください。 saxとかklacksってのを使えば良いのか。
どうやっても空白を拾ってしまう。何でだ。
いろいろ頭痛い。 >>856
これか。字が小さいんだよなぁ。
ttps://www.amazon.co.jp/dp/4908686025 >>860
空白はそのままに認識するのが XML の規約じゃなかったっけ。
空白を除去したいかどうかはアプリケーション側の裁量。
よく使われるライブラリなら何かオプションを持ってたりすることはあるかもしれんけど。 これがLispだ!は教科書っぽくていいな
これと実践あたりを順を追って読んでみようと思う
それからSICPにいこうかな
竹内初めてのとかLand of Lispみたいなノリの本こそLispらしいのだろうが、ついていけないと嫌いになる^^;
LittleはCPSからいきなり難しくなるし、その前も背景知識ないと消化不足になる
Yコンビネータも一応流れはつかめても、自分みたいな頭良くない初学者にはあの試行錯誤から何かを掴むのは難しい
Lispは表面的な軽さと話してることが乖離している書籍が多いし、独学者にはキツイ
これらが、同時並行的にあーなるほど、となると悟ったという事になるのかな? >>863
>LittleはCPSからいきなり難しくなるし、その前も背景知識ないと消化不足になる
おっと、いつのまにか little schemer の読み込みが途絶えてしまっていた、今日から馬力をかけて、ぜひ読みきろう! CPSも紙に書いてトレースすることはできるんだけど
見た目が難しいのにご利益があまり感じられないのは俺の頭が悪いからかな? >>865
Scheme の意味論的には重要なのは確か。
そういう理屈はどうでもいいやってのなら知らなくてもいいかもしれぬ。 >>866
それはどうしたら学べますか?
プログラム意味論とか読めばいいの? >>867
うーん、俺も理屈をきちんと学んだわけじゃなくて CPS 変換を通して理解したんだけど、
CPS 変換しても何もつかめなかったのならどうすればいいんだろう……。
CPS は継続の理解の助けになるんだよ。
入門書で CPS 変換を取り上げるのは継続を理解させるため。
CPS 変換すること自体が普段のプログラミングですごく役に立つってわけではない。
継続ってのは call/cc で取り出せるやつってだけじゃなくて、
Scheme のプログラムでは常に背後にある。
Scheme に限らずどんな言語にも、 C にだってある。
call/cc は背後にあるのを表に引きずり出す仕組みなんだ。
だから背後でやってるやつを明示的にやったらどないや? っていうのが CPS なの。
そんだけ。 CPS変換はCLとかelispでジェネレータの実装に使われてるよね >>868
> CPS は継続の理解の助けになるんだよ。
その通り
> CPS 変換すること自体が普段のプログラミングですごく役に立つってわけではない。
まあ普通のプログラミングではCPS変換なんて必要ないわな
> 継続ってのは call/cc で取り出せるやつってだけじゃなくて、
> Scheme のプログラムでは常に背後にある。
> Scheme に限らずどんな言語にも、 C にだってある。
上の3行はもちろん間違っていないんだけれども補足しておくと、
Cなどの通常のgoto文(やCのbreak文等のような制限されたgoto文)とか例外処理を有する命令型プログラミング言語の意味論(正確には表示的意味論)を語る上でこそ継続が不可欠になる
Schemeからcall/ccを除けば(call/ccやそれを含むライブラリ手続きの類を一切使わない範囲でしかSchemeを利用しない人は)継続を使わない意味論で考えても何も問題ない
例えば、命令型言語でも制御構文としてif文とwhile文しかない(goto文やbreak文等のジャンプは含まない)言語…しばしば「While言語」とか呼んで手続き型言語の表示的意味論の
説明用としてに最初に取り上げられるミニチュア言語(一応、万能ね)…の意味を与えるだけなら継続は必要ない
そういう単純な(いわゆる「構造的」な)制御フローしか許さない言語では、個々の文(命令)の意味は状態から状態への写像(つまり文の表すものは一つの状態変換関数)として考えれば済む
goto文や例外処理のような構文に関して制御の流れが(文の構文構造について)構造帰納的でなくなる制御フローを生み出してしまうものを含んだ言語の意味論を考えようとすると継続が不可欠になる
もはや、個々の文を状態変換関数(そして個々の式を状態の集合から値の集合への一つの関数)として考えるような直感的に分かり易い意味の与え方は通用しない
表示的意味論の生みの親のStracheyが、compositionalつまり大雑把には構造帰納的に意味を与える表示的意味論において構造帰納的でない制御フローを生み出すgoto文の意味を
如何に与えるかで悩んだ末に発明した概念こそが正に継続なんだ
(因みに日本語の表示的意味論の教科書でやや古いものは“continuation”の訳語として「継続」でなく「接続」という言葉を使っている場合があるが両者は全く同じ) 何時からこんな長文のレスが出来るようになったのかと >>865
簡単なスタックマシンにコンパイルしてみてはどうか? >>872
継続がない言語からね
CSPありとなしで比較して CPSは必ずしも再帰で使う必要はないということでいいのかな
リトルのCPSが消化不良なのは前の章までの理解が足りてないってことか 再帰の際に、例えば階乗計算で終端条件から戻ってきて
1*2*3*.......*(n-2)*(n-1)*nと掛けられるものも継続ですか? >>877
再帰はなくても
関数からのreturn実行が
継続の適用そのものです C ではアドレスが継続だと思えばだいたい合ってる。
環境が保存されないから Scheme より限定的だけども。
C だと実引数と一緒にリターンアドレスもプッシュするじゃん?
それと同じように Scheme でも戻ってくる継続を暗黙に渡してるんだよ。
Scheme の call/cc は gcc 拡張の __builtin_return_address みたいなもん。 >>877はあってますか?
終端から戻ってきた値が、入れ子の外側、つまり継続に渡されて
さらに外側の継続に渡されて
継続がなくなったら値がプリントされる
というイメージなんだけど Cで継続を保存しようとしたら、setjmpで保存してるもの(全レジスタの状態)とスタックの内容のコピーだろ(場合によってはかなりのサイズになるが) >>884
setjmp/longjmp は、スタックポインタは保存してもスタックの内容のコピーはしない、だからネストの浅いところから深いところにジャンプできない >>885
ん?だからsetjmpの内容とスタックの内容をコピーすると思いっきり書いたつもりだったが… C++ coroutinesだとスタック全コピーも実装の有力な候補だな というか、おととし最後に聞いたときには>>884の言う通りでほぼ決まりみたいな話だった
C/C++では何と、スタックの中を書き換えることができるのだ! Smalltalkならスタックフレームもオブジェクト Smalltalkって業務で使ってるとこあるのかな
LISP系よりはありそうなんだが ヨーロッパや南米での事例が多いとか
https://medium.com/@newapplesho/今時-2017-のsmalltalkの始めかた-93c044820e1b
日本にも地味に仕事あるらしいけど守秘義務で見えにくい
スーパーの古いレジ(POSシステム)で使われているのを見かけたのはNEC系のこれか?
http://tech.nikkeibp.co.jp/it/members/NT/JIREI/20011220/1/
比較的最近の話題はLispばりにスタートアップに活用されたこと
http://web.archive.org/web/20171111102557/https://thepedia.co/article/1068/ >>890
> Smalltalkって業務で使ってるとこあるのかな
> LISP系よりはありそうなんだが
少なくともアメリカでは実アプリをSmalltalkで作ってるケースはほとんどないんじゃないと思うが
プロトタイプをSmalltalkでちゃっちゃと作ってしまい動作確認をするってのはアメリカでも昔からさほど珍しくないそうだが
ちなみにCommon Lispはアメリカでは以前から実用アプリの記述言語としてそれなりの頻度で使われてるよ >>893
Scheme 用語で言う「環境」のことな。
それを含まないから限定的と説明しているわけ。 >>894
Cではと限定してんだから、普通にsetjmpと言ってほしいんだが…
IP(インストラクションポインタ)だけを指して限定的な継続言われても逆に分かりにくいと思うが 環境をあえて使わない継続の応用はあっても
環境を含むことができない機構を(「限定的」と断ったとしても)継続だと言い張るのはオカシイよ 別に「限定継続/delimited continuation」ってものもあるしな
話がややこしくなるだけで理解の助けにならない Racket で escape continuation って言ってるやつと近いかな。 schemeをjsに変換してreactやるとかelectronでGUIアプリ作るとかいう話ない? scheme->jsの変換は簡単そうだね
継続使ってなければ そもそもJSにトランスパイルできる
まともなscheme処理系が無いだろう 実践Common Lispで覚えた
formatも同じく ocamlでさえjavascriptにコンパイル出来るというのにschemeも頑張ろうや Scheme -> Clojure -> javascript の順番に変換するなら、
Clojure -> javascript はすでに自動変換だし、
Scheme -> Clojure も define -> def 等、機械的な置き換えである程度出来るから、
単純なプログラムを変換することは出来るけど、それほど需要がないから無いんじゃないの。 つうかemscriptenで幾つかの実装が動いてるよね
ただそれだけで emscripten で C言語 -> javascript に変換が可能だから、Chicken で Scheme -> C言語 に変換すれば、
Scheme -> C言語 -> javascript が実行できるハズか。うまく通らないコードもあるだろうけど。 >>908
そんなチキンなやり方が許されるとでも? >>908 >Chicken
>>909 >チキン
日本語でおk ところで「ブラウザでCLを動的にJSにトランスパイル可能なライブラリ」って聞いたら何が思い浮かびます? 質問です!
動的スコープってスタックに積み上げるだけで実現できるじゃないですか
静的スコープってどうやって実装すればいいんですか?ヒント下さい コンパイル (意味解析) 時にスタックを使えばいいんじゃないのかな。 >>917
なるほど、意味解析時にスコープの構造をスタックで再現しといて
eval時に該当するスタックを参照できればいいってことですよね。
なんだか、ソースマップみたいですね。ひとつひとつのAtomに該当するスコープの参照を持たせるとなると、なんか重くなりそうですね Have you ever read The Little Schemer? => #t
Have you ever read The Seasoned Schemer? => #t
Have you ever read The Reasoned Schemer? => #t
Have you ever read The Little Prover? => #t
Have you ever read The Little Typer? => #f
What's The Little Typer? => Pie language book. David Thrane Christiansen のやっている Idris や Pie language といえば、
依存型 (dependent type) を使用した Type-Driven Development かな。
定理証明系の次の話題としては順当なところ。 依存型についてのテキストはこれまでにこういうのが出てるよ。
Edwin Brady "Type-Driven Development with Idris"
Adam Chlipala "Certified Programming with Dependent Types"
Aaron Stump "Verified Functional Programming in Agda"
Edwin Brady と David Thrane Christiansen は協力して Idris を作ったひとで、
今回、Christiansen が Racket 上で Pie language を実装したみたい。
Pie languageの実装を理解させる本が出ることで Type-Driven Development の
低レベルでの詳細が明快になると期待できる感じかな。 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
VU7Z1 ちょっと聞きたいんですけど
JSONをS式で書いたらどんな書き方になると思いますか?
(users . (
((Name . John)
(Age . 25))
((Name . Mike)
(Age . 24))
))
みたいな感じですか? 素直に連想配列にした方が良いのか、それだと巨大なデータの時にアクセス効率が悪いからハッシュテーブルやdefstructした方が良いのかとか、一筋縄では行かないだろう Expat みたいな方式で、オブジェクトの構築はユーザまかせにするってのもひとつの案かな。
まあ、 JSON が必要な場面は設定ファイルとかウェブ API の類とかだと思うので、
極端に巨大な JSON を仮定する必要はあまりないと思うが……。 JSONをS式で書くといっても、いろいろやり方はあるよね。
Pie language みたいにDSLを使って、Name型、Age型、users型を定義すれば、
型推論、Type-Driven Development を導入できる。 PIE には、元々「インド・ヨーロッパ祖語」(Proto-Indo-European language) という意味があるらしい。
そこから転じて Type-Driven Development の祖語たれかし云々。
Pie言語のような Type-Driven Development と J-Bob(ACL2) の定理証明器の組み合わせによって、
新しいプログラミング・サイクルがもたらされる。
[1] 型を定義する(自動的に型チェックもされる)だけで、
[2] Type-Driven Development 環境が型定義から実行可能なプログラムの雛形を生成してくれる。
[3] プログラムの雛形に実装部分を書き加える。
[4] 書き加えた実装部分の数学的正しさを定理証明器でチェックする。
こんな感じで開発するだけでプログラムの正しさが保証付きで出来上がる。もちろんOOPでもOK。
将来、ほとんどの言語がこういう機能を持つと思われる。 荒っぽく言うと、英文作成時にtypo checkerとgrammar checkerを併用すると、
正しい英文が簡単に書けてしまう。そのプログラミング言語版みたいなものかと。 既存の XML や Json のデータからスキーマを構築するやつはどっかで見たことある。 >>934
JSONスキーマつかってvalidationするやり方は、テスト駆動開発だからミスリード。 初心者なんだけど、qiitaでlispの勉強ブログやるのどう思う?
ブログとか自分の趣味ではないんだけど、勉強はかどるかと思って。 >>936
いいと思うよ。
ただ、 Qiita はブログホスティングサービスではなく、
「知識を共有する」ということをコンセプトにしたサイトだから、
やったことを箇条書きにするだけとかコードが貼っているだけみたいなのではなく、
自分に続く人に参考になるような書き方を心がけてね。 数行のコードをコンパイルしてみた
chickenでとても小さいバイナリが生成されて満足したあと
Racketが生成するバイナリの大きさに驚いた
そしてSBCLでやってみたらさらに5倍以上も大きくてビックリだわ
それぞれに理由があるのは分かるけど 実行ファイルのサイズがでかくても役に立つアプリだったらいいんじゃないの
役に立たないアプリだからサイズが小さくないとまずいって話かな SBCLで「ビックリ」したのはこれ
(eq 'abc 'abc) ;=> T
(eq 'アイウエオ 'アイウエオ) ;=> T
'アイウエオ ;=> アイウエオ
'㌰㌰ ;=> ピコピコ
(setf (sb-ext:readtable-normalization *readtable*) nil) すれば変換されなくなる
http://www.sbcl.org/all-news.html#1.2.5 皆様に質問です!
JSCLみたいに「サーバサイドもクライアントサイドもlispで!」みたいな思想のやつって他にもありますか?
単にトランスパイラというわけでなく、ブラウザでevalできるのが理想なんですけど...
よろしくおねがいします! >>939
自分はFDDの時代から使ってるような老害なので、バイナリは機能なりの大きさのほうが自然に感じるよ
まあ本体が小さくても巨大なランタイムが別にあるんだから同じだろと言われればそれまでだけど スマホで無駄にデカイバイナリーは迷惑だけどPCアプリのサイズなんて気にしない。
昔はユーザーもアプリサイズやメモリー使用量に敏感だったけど、今はそんなこと気にしてないみたいだし。 すみません、LISP初心者ですが、追加の質問させてください!
JSCLを試してみようとgithubのGetting StartedとBuildの項目に挑戦しています。
https://github.com/jscl-project/jscl
サーバでnpm install -g jsclしたあと、jscl-replコマンドを打つことでreplが動くところまではできたのですが
GithubのBuildの項目のところでつまずいています。
git clone https://github.com/jscl-project/jscl.git
することでnode_modulesやpackage.jsonなどが存在するプロジェクトディレクトリ上部に
jsclディレクトリが作成されたのですが(一体これはなんでしょう?サンプルプログラム集なのでしょうか)
replで(jscl:bootstrap)を評価しても
ERROR: The symbol `"BOOTSTRAP"' is not external in the package #<PACKAGE JSCL>.
と表示されてしまい、次のステップに進むことができません。
このステップは、githubのreadme.mdで
「あなたのLispにjscl.lispをロードし、ブートストラップ関数を呼び出して実装自体をコンパイルします」
「ソースツリーの最上部にjscl.jsファイルが生成されます。 これで、ブラウザでjscl.htmlを開いて使用できます。」
と記載があるので、(jscl:bootstrap)を実行することによりgit cloneで落としたプロジェクトをコンパイルし
出力されたjscl.htmlにApacheなど使ってアクセスできるようにすれば、bootstrap?とかいうサンプルアプリが動くと思っているのですが
何がいけないのでしょう??
マニアックな質問で申し訳ないのですが、ぜひお助け願います。
(ところでbootstrapってなんでしょうか?cssフレームワークのTwitter bootstrapのことでしょうか?) SBCLは実行ファイルを圧縮して作成できる
40MBが10〜15MB位になるはず
それでもデカイけどね
ちなみに起動時間は全く変わらない よく考えたらスタックオーバーフローとかで質問するべきだったかもしれません(´・ω・`;) >>947
> 「あなたのLispにjscl.lispをロードし、ブートストラップ関数を呼び出して実装自体をコンパイルします」
マニュアルの文章は、あなたが使っている LISP 処理系の上で jscl.lisp をロードした上で (jscl:bootstrap) を評価せよという意味だと思うんだけど、
あなたがやっているのは jscl-repl を起動した中で (jscl:bootstrap) を評価しているように読める。
そうだとしたらそんなものは無いので無いというエラーになるのはわかる。 >>950
ご回答ありがとうございます!
つまりCLISPかなにか、適当な処理系をサーバにインストールして
そこから呼び出せばいいのですね!?
試してみます! stackoverflowってホントの初心者が質問してもいい雰囲気なん? >>954
雰囲気ってのが曖昧だけど、質問内容が馬鹿げたものでもどんどんしていいよ。
初心者の質問内容がしょうもないことなのは普通のこと。
だけど、質問の仕方にはある程度の作法がある。
https://ja.stackoverflow.com/help
「ホントの初心者」というのは自分が何を知りたいのか理解していないことが多いので、
回答できる質問に修正されるまでしつこくコメントされるかもしれないけど、
それは非難ではなく回答するために必要な対話なので、面倒くさがらないでね。 >>955
>自分が何を知りたいのか理解していないこと
それがわかるようであれば、回答を半分得たも同然ですね…
私にはわからないことが沢山あります、それが減る気配もない… Gauche の 0.9.6 リリースが近いらしい >>957
川合さん、未だメンテしてるのか。
ハワイで俳優業やってんじゃなかったけ? >>958
ずっと兼業してるみたいだよ。
俳優としての履歴はここに書かれているけど、 (実際には仕事につながらなかったオーディションも含めると) 2003 年からスタートしてる。
http://practical-scheme.net/wiliki/wiliki.cgi?Shiro%3AAuditionRecords
スクウェアの映画の仕事を終えてから Scheme Arts という名前で法人 (といっても史郎さんひとりの会社だが)
を立ち上げてコンサルティングの仕事を始めて、そのほんの少し後から平行して俳優としても活動してることになる。 0.9.6 キタ――♪ o(゚∀゚o) (o゚∀゚o) (o゚∀゚)o キタ――♪ 関数型言語で画像処理をやってみたいんだけれど
Common Lispで画像読み込みの定番ってある?
debianでcl-png使おうとしたらlibpng12が必要みたいで
使えませんでした。(libpng16ならある)
clwikiに載っているimageライブラリでドキュメントが充実してるのって
cl-pngが一番なんだけど。 >>962
Scheme やね。
TinyScheme がベース。
R5RS のサブセットになってる。 ラムダ計算と純lispはともにチューリング完全
だからlambdaだけで純lispが作れるはず
実際、cons,car,cdrは作れる
(define (my-cons a d) (lambda (f) (f a d)))
(define (my-car ad) (ad (lambda (a d) a)))
(define (my-cdr ad) (ad (lambda (a d) d)))
でも、atom?またはpair?はどう作ればいいの? 教えてください。初心者です。
(defun test ()
(let ((result '(0 0 0 0 0 0 0)))
(format t "~{ ~a ~}" result)
(incf (nth 4 result) 7)
(incf (nth 6 result) 6)
result))
この関数なんですが、実行するたびに結果が変わるのです。
HOGE 28 > (test)
0 0 0 0 0 0 0
(0 0 0 0 7 0 6)
HOGE 29 > (test)
0 0 0 0 7 0 6
(0 0 0 0 14 0 12)
(let ((result (make-list 7 :initial-element 0)))...
にすれば意図したとおりに動作するのは分かっているのですが、
何で元の関数定義でだめなのかが分からないのです。
ちなみに、Lispworks 7.0 Windows 32bitです。
他の処理系でも同じような動作になるのでしょうか。 何でこうなるかは、何となくわからなくはないのですが(1回目の実行と2回目の実行で同じリストをletで束縛してるってことですよね?)、
letってそういう動作するのを想定して使わなきゃいけないものなのか、ってのがわかってないのです。
僕の理解では元の関数定義でいけそうな気がするのです。 (defparameter *FOO* '(bar bar bar))
(defun hoge-is-foo (&optional (piyo nil))
(let ((hoge '(fuga fuga fuga)))
(if piyo (setf *foo* hoge))
(format t "HOGE: ~{ ~a ~}~%" hoge)
(format t "*FOO*: ~{ ~a ~}~%" *foo*)
(if (eq hoge *foo*)
(format t "HOGE IS FOO!~%")
(format t "HOGE IS NOT FOO!~%"))))
PIYO 82 > (hoge-is-foo)
HOGE: FUGA FUGA FUGA
*FOO*: BAR BAR BAR
HOGE IS NOT FOO!
NIL
PIYO 83 > (hoge-is-foo t)
HOGE: FUGA FUGA FUGA
*FOO*: FUGA FUGA FUGA
HOGE IS FOO!
NIL
PIYO 84 > (setf (car *foo*) 'baz)
BAZ
PIYO 85 > (hoge-is-foo)
HOGE: BAZ FUGA FUGA
*FOO*: BAZ FUGA FUGA
HOGE IS FOO!
NIL
こーゆーもんなん? >>966
let の使い方というより、 quote されたリストの破壊的変更は literal object の変更にあたるから未定義動作になるはずで、そのせいで変な挙動になってるんだと思う。
ちなみに Allegro だと LispWorks と同じ挙動になった。
SBCL だと警告で "Destructive function SB-KERNEL:%RPLACA called on constant data: (0 0 0)." と出る。
で、繰り返し呼んでも毎回 (0 0 0 0 0 0) が返されるみたい。 >>967
あ、質問の趣旨が違うか。
(defun hoge ()
'(1 2 3))
があるときに、
(eq (hoge) (hoge))
は、同じリストを返すのだから常に T になるのか?って話かな >>970
966です。
僕が知りたかったのは>>969の内容です。どうもありがとうございました。
未定義動作なのですね。基本的にこのような破壊的代入は避けるってことですかね。
しかし、これが未定義だと、確率は低いでしょうけど、いつかどこかで事故が起こったりするんじゃないのかな。知らんけど。 >>971
うーん、リストを破壊的に変更する場合、上のようにリテラルを破壊するのもまずいし、リテラルでなくても部分共有されたリストだと予想外の場所に影響が及ぶので、自分は安全とわかってないとやらないです。
破壊的変更をするのが前提なら、 list 関数や言及されてるmake-listで新しく作ったり、 copy-list で複製してからいじったりすることが多いかも。 >>972
破壊的な変更には注意が必要なこと自体は、入門書などを読んで知っていたのですが、
今回の例では関数を呼び出す度に別のリストをletが束縛するだろうjkと勝手に思っていました。
勉強になりました。ありがとうございます。 >>966
SBCLは警告が出るから出ないように修正するだけだし、無視しても意図した通りに動く
LispWorksは警告出ないの? 自分の環境でSBCLでやってみたら↓みたいになった。
個人的にはLispworksの挙動より意味不明かも。
(hoge-is-foo)はLispworksと同じ結果。
* (test)
0 0 0 0 0 0 0
(0 0 0 0 7 0 6)
* (test)
0 0 0 0 7 0 6
(0 0 0 0 7 0 6)
* (test)
0 0 0 0 7 0 6
(0 0 0 0 7 0 6) リテラルのリストに対する破壊的変更はダメ
っていうのはLand of Lisp(の訳注)で初めて知った
他の本やサイトでこれに関する注意を見た覚えがない
「literal object の変更にあたるから未定義動作になる」(>>969)ということは、リストに限らないんだね
[1]> (defun f () (let ((x "abc")) (format t "~S~%" x) (setf (elt x 0) #\!) x))
F
[2]> (f)
"abc"
"!bc"
[3]> (f)
"!bc"
"!bc"
[4]> CLHSで "The consequences are undefined if literal objects are destructively modified." って書いてあるページ
http://www.lispworks.com/documentation/HyperSpec/Body/03_ga.htm
そして、 literal の方には "appearing as data in a quote form" なんて書いてあるので (http://www.lispworks.com/documentation/HyperSpec/Body/26_glo_l.htm#literal)
quote の中身は literal, よって破壊的に変更すると undefined ..? 何故maxには:keyがつかえないの?
定義だから。いや、知ってるけどあってもええやん。
みんなreduceとか使ってやってんの? リテラルの破壊が駄目ってのは割と一般的な気がする。
C がそうなってるのを知ってたので、
後に他の言語を学ぶときも意識して仕様をチェックしてる。 >>977
SBCLは警告出すということは危険なコードと言うのを認識してコピーを作成してるんでしょ
ちなみにEmacsだとクオートされたリストの書き換えは問題ないからついやってしまうな >>977
すまん間違えた
普通にリテラル内が書き換えられてるって事か >>973
なるほど、first側にatomかpairかのフラグを入れて、実際のリストの構造はsecond側に入れればいいのか。
ありがとう、この線でやってみる。 mapcarしてremove-if #'nullするのと、
mapcan使うのとどっちがおすすめなん。 >>985
filter 的な話?こういう
(mapcan #'(lambda (x) (and (numberp x) (list x)))
'(a 1 b c 3 4 d 5))
=> (1 3 4 5)
上の例は CLHS からの引用だけど (http://www.lispworks.com/documentation/HyperSpec/Body/f_mapc_.htm)
そこで 「mapcan を使った idiom」とか言ってるから、 mapcan でいいんじゃないの。 >>980
:key を持つのは sequence か cons を扱う関数/マクロだけみたい。
max は数を扱う関数だから :key がない、くらいの理由なのではと予想。
で、僕だったらそういう状況は loop ~ maximize で書いちゃうな:
(loop with list = '((1 a) (100 b) (5 c))
for i in list
maximize (car i)) 1の関連スレっているの?
どこもレス皆無なんだけど。
ここらへんは辛うじて今年レスがある。
【Lisp】プログラミング言語 Clojure #4【JVM】 [無断転載禁止]©2ch.net
http://mevius.5ch.net/test/read.cgi/tech/1483498849/
【GNU】Emacs Lisp 【Elisp】
http://mevius.5ch.net/test/read.cgi/tech/1382223056/ Lisp系だからってひとまとめにするには違いが大きすぎるし、
ちょっとしたことならともかく、
入り組んだ事柄を話すにはやっぱり専門のスレがよさそうな気もするし、
それぞれの言語でコミュニティがあるから、
5ch は雑談程度って割り切ってもいいのかもしれないとも思うし…。 Maxima以外に実用出来るオープンソースの数式処理システムを知らないのだけど
Common Lispが優秀過ぎるからmaximaしかないのか
自分の知らない数式処理システムが他にあるのか >>990
俺が知ってるのだとこういうのもある。
http://www.math.kobe-u.ac.jp/Asir/asir-ja.html
https://www.gap-system.org/
貢献する人が多いと良くなっていくのは当然だし、
良くなるとまた人が集まってくるというスパイラルが出来るので、
一度人気が出るとあえて他の不人気のプロジェクトに手を出そうという人は
現れにくいんじゃない?
まあ、数式処理と一言で言っても数学の分野は広大だから、
今までコンピュータで扱えなかった分野のためのソフトが新たに出てくることだってあるだろうし、
ちょっと別の分野用の数式処理ソフトを探したら案外たくさんあるかもしれないぞ。 >>989
ええ……
Lispでスレ分割なんかしたら
過疎って仕様がないぞ
現に今過疎ってるのにもっと過疎る んじゃ関連サイトは過去スレを除きとりあえず残すけどええんか? >>992
分割しようってのじゃなくて、現時点でそれぞれにスレ立ってるやつがあるわけよ。
個別にスレ立ててるやつは、
ここでやるのはちょっと違うなと思ったからこそ立ってるわけでしょ?
統合するとなると違和感は有るよなっていう程度の話。 このスレ以外ほぼ更新ないけど関連スレは残したよ。
3年以内に消費したいね。
Lisp Scheme Part41
http://mevius.5ch.net/test/read.cgi/tech/1531587928/ このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 1217日 1時間 23分 46秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。