Lisp Scheme Part41
Racket の 7.0 が出た。 コアを chez に置き換える方向で進んでるんだね。 a little schemer/「scheme 手習い」 https://www.amazon.co.jp/dp/4274068269/ を読んでいます(ずいぶんと時間がかかっています)が、次のプログラムがさっぱり理解できなくて困っています 第5章「*すごい* 星がいっぱいだ」 この章の最初の方までは困難を伴いながらも、なんとか理解できました、この章でのこんな感じのコードを、仕様をみて独力で書きおこすことはできています https://ideone.com/fPHC2z ところが、p.92 から >Q: eqlist? はなんですか。 >A: 2つのリストが等しいかどうかを決める関数です。…@ >Q: eqlist? は、その引数についていくつ質問をしますか。 >A: 9つです。…A >Q: なぜ 9 つの質問があるか説明できますか。 >A: 自分の言葉で説明すると次のようになります。 >「各引数は次のいずれかです。・空リスト・アトムがリストに cons されたもの・リストが別のリストに cons されたもの >たとえば、最初の引数が空になるのと同時に、2番目の引数は、空リストか、car の位置に1つのアトムまたはリストを持っています。…B >Q: eqan? を使って eqlist? を書きましょう >A: https://ideone.com/vjYCZ5 この解答例がさっぱりです、実はAからよくわかっていません コードのコメントは私がつけたのですが、最後の方は混乱してしまって…何がわからないかわからない状況です。 何か理解するための手がかり足がかりヒントはないでしょうか? >>6 私はその本を持ってないのでそのあたりの問題を取り上げたブログ記事を見ながら説明しようかと思ったが、 その Q&A の通りとしか言いようがないんで、何がわからないのかよくわからない。 困ったな。 リストの先頭を見た時にあり得るパターンが 3 通りで、 l1 が 3 通りと l2 が 3 通りなら組合せは 9 通り。 9 通りのパターンは 3 種類に分類できて、 ・ l1 と l2 の先頭が空リストなら真 ・ l1 と l2 の先頭が一致すれば次の要素に対して再帰的に同じ処理をする ・ l1 と l2 の先頭が一致しないなら偽 となる。 実際のコードにするにあたって、空リストに car, cdr 手続きは適用できないんで、チェックの順番を気にするくらいかな。 引数が2つあり、それぞれは3通りの場合があるわけだから 引数の組み合わせとしては3×3=9通りの場合がある。 ※引数はリスト(空リストを含む)と仮定していいようだ。 愚直にこの9通りの場合分けを展開するとこの表↓のようになるので、それをそのままコードにしたのがその解答例。 A B 等しい? () () #t () (アトム . リスト) #f () (リスト . リスト) #f (アトム . リスト) () #f (アトム . リスト) (アトム . リスト) (and アトム同士が等しい リスト同士が等しい) (アトム . リスト) (リスト . リスト) #f (リスト . リスト) () #f (リスト . リスト) (アトム . リスト) #f (リスト . リスト) (リスト . リスト) (and carのリスト同士が等しい cdrのリスト同士が等しい) 他のソフトウェアに組み込むスクリプト環境でTinySchemeを使おうかと思っているんですが スクリプトの中からファイルIO関係の機能は使えないようにしたいです。 この場合、走らせるスクリプトの前に、open-input-file等のIO関係の関数を無害な関数で再定義する部分をくっつけてしまえばOKでしょうか? >>9 なんらかの方法で元の定義にアクセスできたら脆弱性になっちゃうから、 要らないなら削除する方が確実だと思う。 どのくらい確実にするかってのは程度問題だけど 削除する分にはそんなに手間でもないし。 >>10 ありがとうございます。 削除というのは、その機能をSchemeのソースから削除して再コンパイルするということですか? 依存型についてのテキストが出てるよ。 Daniel P. Friedman, David Thrane Christiansen "The Little Typer" Boro Sitnikovski "Gentle Introduction to Dependent Types with Idris" Edwin Brady "Type-Driven Development with Idris" Adam Chlipala "Certified Programming with Dependent Types" Aaron Stump "Verified Functional Programming in Agda" Idris と Pie言語 ではλ関数とπ関数が同じように導入されているので相互に勉強できるのがいい。 π算法 Robin Milner "Communicating and Mobile Systems: The Pi Calculus" Davide Sangiorgi, David Walker "The Pi-Calculus: A Theory of Mobile Processes" Matthew Hennessy "A Distributed Pi-Calculus" π算法はもともとCCSの拡張としてRobin Milnerらによって考案された、並行計算(π算法はλ算法の並行版)を表すモデルであり、プロセス計算の一種。 A Little Taste of Types - Code Mesh 2017 - David Christiansen https://www.youtube.com/watch?v=3z9nISI4ppw A Little Taste of Dependent Types 2018 - David Christiansen https://www.youtube.com/watch?v=1BWYy2-WM-o Gaucheのリファレンスマニュアル日本語版pdfはないのでしょうか? >>17 Gauche のソースツリーの doc ディレクトリで make pdf コマンドを実行すれば、 pdf 形式のドキュメントのビルドプロセスが走ることになってるよ。 ただ、 TeX を使うみたいなんで、 TeX を導入するのが面倒ってことはあるかも。 公式からは PDF 形式の日本語マニュアルは出してないっぽいね。 よく見ろ別人だぞ。 まさか同一人物なわけがあるまい。 話題がなさすぎるので近頃は C++ スレばかりにいるんだけど、 なんか面白い話題があればどんどん書いてよ。 WindowsでMinGWがインストールされておらずMSVCだけある状態で C言語のhelloworldプログラムでgauche.hをインクルードすると gauche.h内の#include <sys/time.h>の部分でエラーになります。 C言語からGaucheを利用する場合はMinGWがインストールされていることが前提という解釈であっているでしょうか? >>28 はい。 Gauche をビルドするためには MinGW というか (MinGW を含めた開発環境であるところの) MSYS2 を要求しています。 https://github.com/shirok/Gauche/blob/master/doc/HOWTO-mingw.adoc 少し古いバージョンは (MSYS2 ではなく) MSYS を要求していました。 gauche.h もその開発環境に依存しているので、 gauche.h を include した C のコードは MSVC ではコンパイルを通りません。 つまり、 Gauche の拡張モジュールや Gauche を呼び出すプログラムを C で書こうとするなら、 Windows では MSYS2 を使う方法しか想定されていません。 ただ、過去に「VC++用ポート」を試みた記事が WiLiKi に残っていますし、 ある程度は動いていたようですので、手間を書ければ全く不可能なことというわけでもなさそうです。 https://practical-scheme.net/wiliki/wiliki.cgi?Gauche%3AWindows%2FVC%2B%2B Gauche の実態は単なる DLL ですから、Gauche 自体を MSVC でコンパイルするのは難しくても Gauche を呼び出すプログラムを MSVC で作る分には頑張ればなんとかなる可能性は充分にあるように思います。 Racket のコアを chez のに置き換える話が以前に出てたけど、 もうほとんどできたみたいね。 次のリリースあたりからはそれになるのかな。 R7RS-Large の Tangerine Edition は議論・投票への参加者が少なすぎてちょっとアレな状況みたいね。 積極的に参加してあげて! 界隈でなんだかちょっとだけ ISLISP の人気が出てきてるというか ここ最近になっていくつか新しい実装が発表されてるんだけど、 使ってみた人いる? へー。 そうなのかと思って経緯を調べてみたりしてたんだが、 その過程で ISLISP の IS は International Standard の略だと見つけた。 id.nii.ac.jp/1001/00003362/ 仕様にも書いてないから知らんかった。 もっと古い時代に STANDARD LISP という名前の Lisp があったそうで、 http://www.softwarepreservation.org/projects/LISP/stanford/Hearn-StandardLisp-AIM-90.pdf それ故に標準化にあたって単に Standard とは名乗れず、 Common Lisp が Common Lisp という名前になったのもこのあたりの事情があるらしい。 単に名前を付けるだけでも変な苦心をしてるんだな。 イスラミックステートLISP 処女とヤリまくれるらしいぞ! >>38 イスラミックステートにかけるなら、 支配地域が縮小してるらしいぞというところに引っかければよかったんじゃないかと思ったが、 縮小どころか元々たいして使われてなかったということに気づいた。 >>39 大してして使われていない (少なくとも私の観測範囲では) と思ってるけど、 今後の発展があれば面白いなとも思ってることは付け加えておく。 (ディスってるわけじゃないんだからね! ってこと) 金払わないと正式な仕様書読めないのか、と諦めた記憶がある>ISLISP ドラフト?は読めたけど >>41 ドラフトと正式版の差は誤字の修正程度だよ。 Racketに対応したArcが出てたのね Arc Forum | Tell Arc: Arc 3.2 http://arclanguage.org/item?id=20772 >>43 ISLISP には興味無いよ。 でも LISP 界に動きがあるのは歓迎するので、 どういう受け止められ方をしているのか聞きたかっただけ。 >>45 ISLispってJIS規格になったんでしたっけ? >>46 JIS の ISLISP は 1998 年の日付になってる。 >>47 お返事、ありがとうございます そうですかISLispはJIS化されてたんですね でも日本で使われてるんですかね? Lispで日本で使われてるのはやっぱりCommon Lispだと思うんですけど(それと教育とかだとScheme(含Racket)が少しあるかな) ISLISP のことはなんも知らんけど、 急に ISLISP 処理系が立て続けに出てきたみたいやから なんか動きがあったんか? と思って >>32 を書いたんで、 私も質問者の立場なんやわ。 大した理由はないのであっても、 始まったならこのまま発展していくといいね。 ISLispのプログラミングテキストや解説書って笹川賢一って人が書いたKindle用の電子的なのが2タイトルあるだけで それ以外は海外でも何も出てないんですかね、Amazon USでタイトルを“ISLisp”で検索しても、その2タイトル以外は ISOの規格票しか出てきませんね とにもかくにも国際規格になったんだから、規格案をプッシュした連中がプログラミングの教科書や言語解説書や入門書ぐらいは 書いて出版するぐらいのことはやるべきなんじゃないかと思うんですが、見事なほどに何も出ていないようで驚きました >>51 Common Lisp の規模が大きくなってまとまらなかった中で 別の提案を整理して100 ページもないような規模の ISLISP を確立したという事情があるので、 完全なサブセットではないけど言語の考え方としては近い部分が多くて かなり小さいサブセット「的」なものという感じ。 つっても、やっぱり別言語ではあるので、それを「どれくらい」とは一言では表せないな。 個人的には、あくまで私の感想としては Lua と JavaScript くらいの距離はあるかなぁ……と思ってる。 昔の情報処理試験で人工知能の分野ときたらLispだったけど今違うのかな? >>53 このスレ (の過去スレ) では何度も話題になっている気がするが、 「人工知能」とは何か、それに「向いている」とはどういう意味かが曖昧なので、 Yes とも No とも言えるというのがおおよその結論。 人工知能を定義するなら「人間の知的活動を代行するもの」であり、 かつてはコンパイラや数式処理なども人工知能の範疇だった。 でも、分野として確立して以降は コンパイラはコンパイラだし、数式処理は数式処理であって、 今ではそれを人工知能と呼ぶ人なんかいない。 逆に言えば分野として確立していない知的な処理はなんだって 人工知能なので、範囲がざっくりしすぎて どんな言語が向いているかなんて言いようが無い。 強いて言うなら、かつては人工知能の主役は記号処理を基礎に据えたものであったので、 そのときの事情を前提にするならば、 それらを記述するには (当時あった他の主要な言語よりは) LISP が向いていると 言ってもそこそこ妥当ではあった。 人工知能でLISPを扱ってる本の巻末付録は大抵駅すぱあとシステムだからな 餃子がスゲー良いこと言ったな… > 逆に言えば分野として確立していない知的な処理はなんだって人工知能 機械学習みたいないかにも人工知能っぽいものでも、人間が理解して理論的に確立してしまえばなんてことない在り来たりな技術になるんだろうな 人工知能のカテゴリのひとつに「ルールベース」があるけど、 これって要するに if 文を並べて判断するようなシステムのことで、 現代的な感覚だと人工知能とは言わんよな。 ひとつのカテゴリとして名前を付けることすら馬鹿馬鹿しい。 (あくまでも現代の感覚で見ればという話なので、 当たり前のものにしてきた先人の努力を貶めるものではないことは断わっておく。) そんなごく当たり前のプログラムも昔は人工知能と呼ばれていたんだから、 人工知能という言葉が指す範囲はとてつもなく広いし、今後も変遷を続けていくと思う。 結果的に LISP が人工知能の記述に「適していた」あるいは「適している」のが事実であってもなくても、 LISP が人工知能の記述を目指しているというわけでもないし、 (LISP 系言語は幅広いので特に人工知能を指向したものも有りはするかもしれないが) 主要な LISP 系言語は Python やら Ruby やらと並べても違和感のないごく普通の汎用言語なんで、 用途を限定してしまうような言説は、個人的にはあまり好きじゃないな。 使いたいように使っていいんだよ。 >>57 > そんなごく当たり前のプログラムも昔は人工知能と呼ばれていたんだから、 > 人工知能という言葉が指す範囲はとてつもなく広いし、今後も変遷を続けていくと思う。 70年代前半だと数式処理(記号微分とか記号積分とか、特に記号積分はね)も立派な人工知能の一分野 ついでに言えば50年代後半だと今で言うコンパイラの研究も人工知能の1テーマだったらしい >>58 はちみつ餃子がすでに書いてるのに >>54 研究者や企業による実験段階+アルファまでAI 商品化され一般に流通したらIT Scheme というか、Lisp のことを少ししか分かっていないんですども、μKanren を使ってみたくて Sheme の処理系をインストールしたんですが Gauche、Guile、MT/GNU Sheme と、入れた全部 に assp がアンバウンドだと言われて動きません。 1.解決方法が分からなくて、自前で assp を書いて動かしてますが、本当はどうやったら assp が 使えるか教えてください。ライブラリをロードするのでしょうか? 2.せっかく書いたので、自前の関数の働きが本当の assp と同じなのか知りたいです。 みなさんならどのように書きますか? 最初に見つかったときに止める場合のセオリー はありますか? 書いてみた関数: (define (assp fn assoc) (let ((rtn #f)) (for-each (lambda (x) (if (not rtn) (if (fn (car x)) (set! rtn x)))) assoc) rtn)) >>63 μKanren のことはよくしらないけど、 assp は R6RS (※1) では rnrs lists ライブラリに含まれるので、 R6RS 処理系ではこのライブラリを import すると使えるようになる。 R6RS 以外には無い。 自分で書くとしたら SRFI-1 (※2) を使える状況なら こんな感じで書くなぁ (define (assp proc alist) (find (lambda(x)(proc (car x))) alist)) ※1 RnRS は Scheme の仕様書の通称。 n に改定番号が入る。 ※2 小さい言語である Scheme では日常的に使うにはライブラリが足りなさげなので、 ユーザーコミュニティとしてライブラリの仕様を考えて文書化したものの集合体が SRFI 。 (RFC みたいな感じ?) SRFI-1 はその最初期のもので、リスト操作系のライブラリ。 仕様の一部ではないので処理系によって SRFI の採用の程度は色々だけど、 実用嗜好の処理系は主要なものはまあまあ取り込んでいる。 今では仕様の検討の前段階として一旦 SRFI にしたりもしている。 >>64 ありがとうございます。Gauche は find があるみたいなので、早速置き換えてみました。 Scheme の規格は、過去のものを包括しているわけでもなく、なかなか難しいものなんですね。 μKanren だけに限らないかもしれませんが、μKanren の Scheme のコードは、普通の オブジェクト指向言語と違って型を作って使い分けするのでなくて、そういう意図でベクトルや ドット対やリストを使い分けていたり、戻す値が何を意図したものなのかわかりにくくて、 短いけど難しいですね〜 μKanrenてユニフィケーションの亜種みたいなもんだから多分どの言語でも大丈夫だぞ >>66 μKanren や miniKanren はいろんな言語に移植されていますね。 実は私も、ある超マイナー言語に移植することでその言語の勉強と、移植したライブラリで なんかしてみようと始めたんですけど、スタック系言語なんで、なかなかすんなりいきません。 あと、コア部分はいいとしても、Shceme でマクロを使っているところをどうするかって ところが悩みどころ。他の言語の移植をみても、そのへんはつくってないものも多い様で。 >>72 サイトのオーナーは個人みたいだけどDNSから消えてるね アーカイブには残ってるんでそっちをみれば? http://web.archive.org/web/20120305231338/http ://karetta.jp/book-cover/programming-gauche webで公開されてるsicpのレビューを なんで翻訳者が違うamazonの書籍のところに書いてるんだ? qiitaにでも書いとけよ chicken scheme のサイト( www.call-cc.org ) が ここ数日ダウンしたままだ 流石にこのままフェイドアウトではないと信じたい パーソナルコンピュータの父アラン・ケイが選ぶ「プログラマー必読の古典本」とは? https://gigazine.net/news/20190813-alan-kays-best-classic-book-programmers/ アラン・ケイ氏が「大ファンだ」と絶賛する本が、プログラミング言語LISPを生み出した ジョン・マッカーシー自身の手による解説書「LISP 1.5 Programmer's Manual」です。 アラン・ケイ氏によると、この本を読んで成長するためには「どうすべきなのか」 「実際にどうしているのか」を意識しながら本を読むだけではなく、13ページに書かれた 例を「自力で書き直す」ことが重要とのこと。 アラン・ケイ氏は「LISPは単なるプログラミング言語にとどまらず、思考を鍛えるのに最適な言語です」 と述べており、「LISP 1.5 Programmer's Manual」を「完璧な古典」だと絶賛しています。 LISP知らん人に勧めても判るのかね MITってschemeやめてpython教えてるんでしょ 紫のSICPやめてpythonの教科書になったのは知ってたけど 何年か前のことだよね > chicken scheme のサイト( www.call-cc.org ) が ここ数日ダウンしたままだ > 流石にこのままフェイドアウトではないと信じたい この件、googleの最新キャッシュ日付(2019年9月24日 12:18:42 GMT )を考えると もしかして "おま国" 的なアクセス制限されちゃってる? 確認ありがとうございます。 "おま環" (お前の環境だけだろ) のようですね... chicken scheme ( www.call-cc.org ) にアクセスできない件、スレ違い気味で申し訳ありません。 0. Googleのキャッシュから ⇒ ◯ (見えないよりマシ...) 1. ルーターのアクセスポート制限を解除 ⇒ × 2. プロバイダー設定( plala ネットバリアベーシック) をフィルタリングOFFに ⇒ × 3. VPN (L2TP/IPsec) で接続 ⇒ ◯ (繋がった!) とりあえず、こういう結果になりました。 plalaが規制してる/ plalaが規制されている どっちにせよこれ以上はどうにもならなそうです。 見れるようになったのでヨシとします。 sicpはそんなに良い本? どういうふうに良い本なのか教えてほしい >>92 俺もつながらん。 プロバイダは Biglobe jpドメインは拒否されてるのかもね 契約してる激安海外VPS経由でアクセスしたら見れたけど、プロバイダ経由だとpingも通らんわ >>95 私の場合は日本のISP(海外の出版社のサイトとかでアクセスした側の国を自動判別している場合は日本と判定される形の接続法)で インターネット接続しているけれどwww.call-cc.orgのHPやその下の様々なページは普通に見えるよ Common lispよりschemeの方がユーザ多いの? 一番人が多そうなのはracket? schemeは実装多すぎてどれを選べばいいのか分からん、 特定実装に依存すると いつか廃れたときに困る。RnRSやらsrfi-xx どこまで使えるのかマチマチだからね。 common lispは今のとこ sbcl にしとけば間違いなさそうな安心感がある read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる