X



Lisp Scheme Part41

0001デフォルトの名無しさん
垢版 |
2018/07/15(日) 02:05:28.62ID:oGr67yTf
Common Lisp、SchemeをはじめとするLisp族全般のスレです

■前スレ
Lisp Scheme Part40
http://mevius.5ch.net/test/read.cgi/tech/1426481152/

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

■関連スレ
【Lisp】プログラミング言語 Clojure #4【JVM】 [無断転載禁止]©2ch.net
http://mevius.5ch.net/test/read.cgi/tech/1483498849/
【GNU】スクリプト言語 Guile【scheme】
http://mevius.5ch.net/test/read.cgi/tech/1239985829/
【入門】Common Lisp その11【質問よろず】
http://peace.2ch.net/test/read.cgi/tech/1411307361/
【Scheme】Schemeインタプリタ Mosh Part1【Lisp】
http://peace.2ch.net/test/read.cgi/tech/1272469779/
【魔法】リリカル☆Lisp【言語】
http://peace.2ch.net/test/read.cgi/tech/1183396621/
Lisp@UNIX版
http://mevius.5ch.net/test/read.cgi/unix/1019926525/
0102はちみつ餃子 ◆8X2XSCHEME
垢版 |
2019/10/06(日) 01:02:08.24ID:RRBV0NuF
Scheme で安心感の強い処理系っていうと Racket とか Guile とかかな。
そう簡単に廃れなさそう。
0103デフォルトの名無しさん
垢版 |
2019/10/06(日) 03:01:34.82ID:Wv7rmhQe
Schemeの無料で使える処理系で例の大顰蹙買ったR6RS対応してるのってあるの?
0104はちみつ餃子 ◆8X2XSCHEME
垢版 |
2019/10/06(日) 09:12:01.09ID:RRBV0NuF
>>103
あるよ。

Racket
Chez
Vicare
Sagittarius
Ikarus
IronScheme
Ypsilon
Mosh
Larceny

R6RS に準拠ってほどではないけど一部をサポートしているものとしては

Guile
BiwaScheme

もある。
Sagittarius と Larceny は R7RS もサポート (R6RS と R7RS を混在させることも出来る) しているよ。
Vicare, Ikarus, Ypsilon は実質的に動きが無くなっているのでこれから使うのはやめた方がいいかもね。
0107デフォルトの名無しさん
垢版 |
2019/10/06(日) 19:19:12.92ID:Wv7rmhQe
>>104
お教え下さり、どうも有難うございました。
RacketもR6をサポートするようになってたんですね。
R6発表後も数年間はRacketはR6対応じゃなかったようなのでサポートする気がないのかと勝手に思い込んでました。
0109はちみつ餃子 ◆8X2XSCHEME
垢版 |
2019/10/06(日) 22:34:51.75ID:RRBV0NuF
Scheme はまだ未完成という意識がある気がするな。
だから実務指向な言語と違って現段階では互換性を重要視してない。

重要視はしてないけど突飛な変更が入ってるわけでもなくて、割と正統進化してると思うよ。
R6RS が異端なだけ。
その R6RS にしたところで R7RS と共存が可能な程度に近しいわけだし。
0113デフォルトの名無しさん
垢版 |
2019/10/24(木) 14:55:50.74ID:9HSU6Di+
関数の値が最も0に近くなる引数を求めたい時、どう書けばいいんでしょう?
繰り返しで引数を少しずつ変えていけばいいのはわかるのですが、定石とかあるんですか?
0115デフォルトの名無しさん
垢版 |
2019/10/25(金) 01:02:52.70ID:IZH7p7oT
微分可能ならニュートン法が簡単

そうでないなら、範囲 [ a , b ] をステップ幅 (b-a)/n で 暫定値を探る。(n:分割数)
それが範囲の左右半分どちらにあるかに応じて値 a, b を更新、あとは再帰的に投入。
ステップ幅 が指定誤差未満になったら a を返して脱出

そのまま愚直に組むだけならそんなに長くならない。
0116デフォルトの名無しさん
垢版 |
2019/10/26(土) 10:42:36.27ID:v7RlO1g+
>>113の言ってる関数は数学の関数じゃなくてプログラムの関数の事でしょ…
多分線形でも微分可能でもないだろう
乱数使って適当な範囲で試行してずらしながら一番近そうな範囲を選択して絞り込んでいくという位しか思い付かない
0117デフォルトの名無しさん
垢版 |
2019/10/26(土) 22:25:16.53ID:IPzUune1
どちらの関数にせよ考え方は一緒じゃないかな。
値の変化が連続的でなければそのやり方では求められないし、連続的であっても極小値に落ち込んでしまう可能性がある。
関数がハッシュ計算するようなものだったら総当たりしかないのでは?
0119デフォルトの名無しさん
垢版 |
2019/10/28(月) 06:33:09.38ID:kIF/RW73
誰かと思ったらグレアムか
奴は口だけのポンコツになって久しいよ
もう実装は無理
0124はちみつ餃子 ◆8X2XSCHEME
垢版 |
2019/11/08(金) 14:53:51.74ID:qQX8Hix+
グレアムは金には困らんのだから残りの人生は全部が趣味みたいなもんだろ。
引退もクソもねぇよ。
0131デフォルトの名無しさん
垢版 |
2019/11/10(日) 06:23:28.13ID:hnRZ9wTQ
グラハムはハーバード、MIT人工知能研、イタリアの美術大出てるんでしょ?
アメリカの大学は学費も相当かかる
ビジネス始める前から「普通の奴等の上」を行ってる人なんだと思うなぁ
頭さえ良ければ、とか思うかもしれないが環境、友人は大事だよ
ビアウェブのパートナーはMITの教授だよね、確か
0132デフォルトの名無しさん
垢版 |
2019/11/10(日) 14:00:02.99ID:jFIdfEKQ
いまPLAIの8章をよんでいるんだけど、次のExerciseの不変条件と言うのがよく分からん・・
ttp://cs.brown.edu/courses/cs173/2012/book/mut-struct-vs-var.html#%28elem._%28chunk._~3cms-setbox.C-case~3e~3a1%29%29

ソースコードはこれ https://bitsend.jp/download/d7ebf31e84a7dc5d8b55a3e3b66ce803.html

Storeに束縛を追加するのはbox、その束縛を参照するのはset-box!とunboxだけだから、
set-box!を評価するときに、ロケーションがStoreに存在しないことは無いように考えているんだけど、もっと数学的に
証明しなきゃいけないんですよねこれ・・
0133デフォルトの名無しさん
垢版 |
2019/11/18(月) 17:16:59.42ID:D69b6YL7
Emacs hy-modeがバグってて動かない
0135デフォルトの名無しさん
垢版 |
2019/12/06(金) 00:43:20.37ID:KafRVWs2
$ ros run
* (+ 31000 33500 1000 2300 16500 300 1000 10100)
64700

おいおい,なんだこのメチャクチャな値
こんなんじゃ,まったく信頼できないんだが
どうなってんだ
しかも再現できないし

$ ros version
roswell 19.09.12.102(NO-GIT-REVISION)
0136135
垢版 |
2019/12/06(金) 03:21:18.04ID:KafRVWs2
正しい値は 95700 なのだが
(- 95700 31000)
が 64700 になることに気づいた

最初の引数,抜かしてんじゃん...
REPL の + 関数,バグってるんだが

それとも WSL がいけないのか? tmux がいけないのか?
0137135
垢版 |
2019/12/06(金) 04:20:18.39ID:KafRVWs2
$ ros run -- --version
SBCL 1.5.5
0141_
垢版 |
2020/01/17(金) 18:22:11.13ID:ceaCkwJJ
>>134
Lispworks 8 でる情報あったんですか?
てっきり次は 7.2 かと。
0142_
垢版 |
2020/02/14(金) 11:14:07.86ID:m79sNhAX
Racket 7.6リリースされたよー
https://blog.racket-lang.org/2020/02/racket-v7-6.html

Chez Schemeの取り込みが進んで、プロダクション・レディになったそうな。
デフォルトにはまだなっていないようです。
0144デフォルトの名無しさん
垢版 |
2020/02/14(金) 23:19:09.23ID:2TRtlmBi
SICPを勉強したくてschemeを一通り勉強したけど
schemeが本当に好きになった
綺麗な言語だなと思ったのはschemeが初めて
0146デフォルトの名無しさん
垢版 |
2020/02/18(火) 22:12:38.88ID:i+WlpfA0
SICPで4.4論理プログラミングがでてきたけど、論理プログラム言語(Prolog)なんて
一生使わんのじゃないのか・・・?俺みたいな雑魚PGは特に。
そもそも俺はなんでインタプリタ作ってるんや・・・
0147はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/19(水) 11:52:11.74ID:mcS2XXQq
>>146
SICP はコンピューターサイエンスの本だから、
いろんなパラダイムについて説明しているよ。
知ってれば便利なこともあるとは思うけど、
必ずしも日常的に役立つというものでもないのも確か。
0149デフォルトの名無しさん
垢版 |
2020/02/22(土) 11:13:35.82ID:dEZr6bBq
歴史、哲学、思想を勉強しても目の前の仕事には直結しない
みたいなことなのかな
0151はちみつ餃子 ◆8X2XSCHEME
垢版 |
2020/02/22(土) 12:07:02.06ID:5jIrjfcF
事実を列挙すれば解を求める処理をやってくれるってのは理想のひとつではあるよな。

実際にはには Prolog が答えを出すメカニズムを理解していないと
答えを (効率的に) 出しやすい事実を上手く与えられない場合もあるし、現実は厳しい……。
0152デフォルトの名無しさん
垢版 |
2020/02/22(土) 21:37:13.68ID:dEZr6bBq
思うんだけどLispというと悟りとか、ゲーデル云々みたいな話がよく言われるけど
Prologではあんまり関連付けて言われないですよね
0153デフォルトの名無しさん
垢版 |
2020/02/29(土) 16:53:01.80ID:RQUlgixi
上にもあるけどprologは論理がそのままプログラムになるっていわれてんだろ
似たようなもん
0154デフォルトの名無しさん
垢版 |
2020/03/03(火) 08:38:08.45ID:VyHc4g1O
hy面白いけどlisperにはrubyの方が人気なんだ
0156デフォルトの名無しさん
垢版 |
2020/03/03(火) 18:09:46.41ID:wrUSgHR4
>>152
> Prologではあんまり関連付けて言われないですよね

Prologは「論理プログラミング言語」と呼ばれたりするけれど書かれたプログラムを実行可能にするためのプログラミング言語であるために
論理のための言語(つまり論理式を記述するための言語)とはかなり違ってしまっているからね

その典型がPrologで動くプログラムを書く上で不可欠なカット “!” ね
あれは本来の論理には対応物がなく論理とは全く縁のないコンストラクトだが
カットを使わなければほとんどのPrologプログラムはまともに動かなくなってしまうだろう

その点、Schemeから命令的な言語コンストラクトおよび標準手続きであるset!とset-car!, set-cdr!を除いた部分は
弱い(weak, つまりλ抽象の本体式中のβ-簡約基(redex)は簡約せずに放置しておく)
作用的順序(applicative order)の評価戦略(reduction strategy)のλ計算そのものだ

call-ccは継続(continuation)というメタな(つまり意味論上の)値を対象レベルに持ち込むmeta-circular的な拡張であり
Schemeに限らずLisp一般で広く採用されているS-式という構文は自分の構文に対する抽象構文の表現になっているから
プログラムが自分自身(や同じ言語で書かれた他のプログラム)のソースコードを記述している言語を対象言語として
自分自身がそれを素直な形で操作できるメタ言語レベルの存在として振る舞えることになるからね

言い換えればS-式という表現形式のために括弧をやたらと多用させられるLisp言語では
ソースコードをその抽象構文(木構造)と同型な形で記述させていると言っても良い

だからLispのプログラムをLispで処理する場合には、C等のような普通のプログラミング言語で書かれたプログラムを処理する場合には
不可欠な字句解析や構文解析が実質上は不要なんだよ

何故ならば処理する側のLispプログラムにとって処理される側のLispコードは最初から抽象構文木と1:1対応する形式で提供される訳だから

正にゲーデルの不完全性定理で行っている形式化された論理のゲーデル数による表現とそれを原始再帰的函数や同述語を含むメタ論理のレベルで
処理する構造が、Lispの世界に対応していると言えるわけですよ
0163デフォルトの名無しさん
垢版 |
2020/03/04(水) 12:50:19.65ID:ujdXlrHA
SECD
Landin’s J
0168デフォルトの名無しさん
垢版 |
2020/03/05(木) 20:34:42.44ID:h922Dn8C
>>82
>>84
MITの件もあるし
今ならPythonでいいでしょ

MITレベルの頭ならLispなんて
すぐ読み書きできると思うが
0169デフォルトの名無しさん
垢版 |
2020/03/05(木) 20:39:40.49ID:h922Dn8C
>>146
>論理プログラム言語(Prolog)なんて
ほとんどのプログラマが
仕事では一生使わないだろうな?
でも設計をする上で参考になる
0170デフォルトの名無しさん
垢版 |
2020/03/05(木) 20:41:41.16ID:h922Dn8C
>>149
Prologの勉強は無駄ではないと思うが
すぐ成果には結びつかないだろうね?

でも長期的には流行りの言語やFWに飛びつくより
地力につながる可能性もあるだろう
0171デフォルトの名無しさん
垢版 |
2020/03/05(木) 20:42:43.57ID:h922Dn8C
>>150
宣言型という点では近いけど言語としては同じじゃない
ユニフィケーションやバックトラックの挙動があるから
0172デフォルトの名無しさん
垢版 |
2020/03/05(木) 20:44:54.71ID:h922Dn8C
>>151
AIはディープラーニングが主流になったが
それはそれとしてアレでPrologがもう少し
分かりやすければ日常的に使うんだけどな
これどうやって書くんだってのが多すぎる
0173デフォルトの名無しさん
垢版 |
2020/03/05(木) 20:47:20.68ID:h922Dn8C
>>156
Lispはメタプログラミングしやすいって理屈は分かるが
実際にそれでものすごい作業効率が上がるかは疑問だな?

なぜんあらメジャーな言語はライブラリが充実してて
それ使えば最初から書かなくても済むわけだから早い
0174デフォルトの名無しさん
垢版 |
2020/03/05(木) 20:48:56.47ID:h922Dn8C
>>159
本当にできるかできないかは知らんが
そういえばメタプロやってるって
声ほとんど聞いたことないな
Lisp勢はマクロマクロうるさいのに
0177デフォルトの名無しさん
垢版 |
2020/03/10(火) 18:23:23.35ID:BcZoFSIR
hy
マクロの入力にpair入れたのに
マクロ実行時にunquoteするとlistに化けるバグがある気がする
0187デフォルトの名無しさん
垢版 |
2020/04/28(火) 11:03:05.28ID:jkGkDNpV
Scheme の map 手続きについて、
手続きを適用する順序 (副作用が発生する順序) は仕様上は未規定ということになっています。
各処理系として保証するということは有りえるんですが、
Racket の場合は保証されていると読み取って良いでしょうか?

https://docs.racket-lang.org/reference/pairs.html?q=map#%28def._%28%28lib._racket%2Fprivate%2Fmap..rkt%29._map%29%29

わざわざ "from the first elements to the last" という書き方をしているからには順序を意図しているように
解釈するのが自然かとは思うんですが、単に範囲を言っていると解釈できなくもないので、
英語と Racket に明るい方がいればご教示賜りたいです。
0188_
垢版 |
2020/04/28(火) 14:05:01.63ID:moc7J10E
>>187
racket使ってるわけでも英語ができるわけでもないけど。
最初から最後までって範囲の話してるんじゃなかろうか。
順序の保証があるなら IN ORDER とか付きそうな気がする。
0189デフォルトの名無しさん
垢版 |
2020/04/28(火) 14:43:15.44ID:jkGkDNpV
>>188
R5RS などでは手続きが各要素に適用される dynamic order は unspecified である
というような表現になってるんですよ。 order という語が主語になってます。

https://docs.racket-lang.org/r5rs/r5rs-std/r5rs-Z-H-9.html?q=map#%25_idx_580

だからわざわざ変えた表現をするからには違うこと (順序が保証される) を言おうとしているんだろうと思いつつも、
明確に順序を強調してるわけでもないな……? というところで解釈に迷ってました。

私は R5RS (など) と言い回しが違うという点に引きずられていましたが、
"from the first elements to the last" というフレーズ単体で見ると範囲のニュアンス
で捉える方が自然ですかね。

私自身はいずれにしても map の副作用の順序に期待しないんですが、
しばらく前に Qiita に投稿されていた記事の中で map の順序が効いてくるコードがあったので、
これってありなんかなぁと思ったという経緯です。
0190デフォルトの名無しさん
垢版 |
2020/04/29(水) 01:16:58.58ID:y02v3tEE
>>187
保証とはどういうことを指しているのだろう
将来仕様を変更しないとは書いていないのは確かなようだ
racketでは引数の評価もleft to rightとは書いてあった
schemeでもfor-eachは先頭から順番に評価する
実際に評価順の違いが観察できるのはchezかな
0191デフォルトの名無しさん
垢版 |
2020/04/29(水) 03:18:21.69ID:ALOjMFFX
>>189
> 私は R5RS (など) と言い回しが違うという点に引きずられていましたが、
> "from the first elements to the last" というフレーズ単体で見ると範囲のニュアンス
> で捉える方が自然ですかね。

いや、違う。
R5RSとRacket Reference v7.6とでのmapが手続き(proc)を適用する要素の順番に関して言及しているのは
各々、以下の箇所だが、両者では明らかに全く異なる。

R5RS>The dynamic order in which proc is applied to the elements of the lists is unspecified.

Racket>Applies proc to the elements of the lsts from the first elements to the last.

R5RSは>>187で君が述べていた通り、リストの要素への適用順序はunspecifiedだと明確に書いてある。

これに対してRacket v7.6ではprocをlstsの最初の要素から最後の要素へと適用すると書いてある、
つまりリストlstsの要素の並びの順番に手続きprocを適用して行くと明記している。
だからprocとして受け取った値を標準出力に書き出す手続きを渡せば、R5RSでは表示される要素の順番はどんな順序でも良いのに対して
Racket v7.6では元のリストlstの要素の並び順に必ず表示せねばならない。

これは私の想像だが、R5RSでmapが手続きを適用する要素の順番を規定しないと明記しているのは長大なリストに対する並列処理を可能にするためだろう。
逆に言えば手続きの適用順序を確実に把握したい場合にはmapでなくfor-eachを使えというのがR5RSを定めたチームの言語設計上の意図だろう。


>>190
> 保証とはどういうことを指しているのだろう

その言語仕様書のそのバージョンに準拠していると宣言している言語処理系は、それを守らねばならない(守っていなければバグだ)という意味だよ。
だから今の例では、Racket Reference v7.6準拠と処理系が宣言したら、その処理系はmapで手続きを適用する要素の順番を必ずリストの並び順に
する義務が生ずる(Racket v7.6の定める言語仕様=Racket v7.6ユーザとの約束の順守を保証せねばならない)、ということだ。

当然ながら、言語仕様書のバージョンが変われば約束(つまり言語仕様による規定の内容)も変更され得る。
0192デフォルトの名無しさん
垢版 |
2020/04/29(水) 06:44:54.55ID:bLWOmnfL
>>187
処理系によって(A B C)の評価順序が
(1 2 3)だったり(3 1 2)だったり(3 2 1)だったりするから
mapのようなリストで処理結果を返すような関数のクロージャ内では原則副作用は起こさないことが求められる
for-eachみたいな初めから副作用を期待する関数はどう並べようが問題は起きない
0193デフォルトの名無しさん
垢版 |
2020/04/29(水) 09:21:45.86ID:sxS/u8Yc
>>192
それは承知しているのです。
ここでは Racket のドキュメントをどう解釈すべきかというのが論点です。

>>191
> 最初の要素から最後の要素へと適用すると書いてある

順番に (in order) とは書いていません。
順序が意味を持つ箇所ではおおよそ order という語で強調しているのに
それがないここでも順番であることを確信してよいほどに
(英語のニュアンスとして) 自明でしょうか。
0194デフォルトの名無しさん
垢版 |
2020/04/29(水) 09:54:06.36ID:sxS/u8Yc
>>191
> 長大なリストに対する並列処理を可能にするためだろう

手続きの引数の評価順序については未規定ではあるものの
"some sequential order of evaluation" という制約がついています。

https://docs.racket-lang.org/r5rs/r5rs-std/r5rs-Z-H-7.html#%_sec_4.1.3

ちょっとわかり難いんですが、これは「同時ではない (かのように動作する)」と解されるそうです。
たとえば

(list (begin (display 'a) (display 'b) 1)
(begin (display 'c) (display 'd) 2))

とあったときに表示は abcd か cdab のどちらかであり acbd だったり cabd だったりはしない
ということです。

map についてはこういう制約は書かれてはいないものの、
順序は規定しないという文言は「既定はしないけどなんらかの順序を想定する」
とも読めなくもないので並列化を許しているとは言い切れない気がします。

副作用がないときに限っては並列化しても仕様に反しないのは間違いないですけど、
その場合は順序に関して有るとも無いとも書く必要がないんですよね。
どうせ観測できないので。
0195デフォルトの名無しさん
垢版 |
2020/04/29(水) 12:39:32.81ID:qQMMu/UY
>>194
mapについては、まえからか、うしろからか好きな方で実装すればいいよ、程度のはなしだとおもってた。
継続を突っ込むとどうとかいうのがあったとおもうけどだれか解説pls
0196187
垢版 |
2020/04/29(水) 13:42:08.04ID:sxS/u8Yc
>>195
継続については「call/cc は副作用を生じる」というひとことで説明できます。
副作用とは何かというのは色々なモデル化のやり方があってはっきりしたひとつの定義を
定められないみたいなんですが、この説明が納得感があって参考になると思います。
https://practical-scheme.net/wiliki/wiliki.cgi?Scheme%3Acall%2Fcc%E3%81%A8%E5%89%AF%E4%BD%9C%E7%94%A8

副作用がないなら順序なんか考える必要はないんですよ。
どの順序で実行されようと並列であろうと (観測できる) 結果は同じなので順序を気にする意味がありません。
結果が同じにならない場合 (副作用がある場合) がどうあるべきか考えるから順序が効いてくるんです。

で、副作用がある手続きの中でも特に第一級継続は (観測できるだけでなく) 流れを変えることが出来るから
どれが妥当なのか結論が出ないなぁってことです。
0197デフォルトの名無しさん
垢版 |
2020/04/29(水) 14:57:29.24ID:u7alO7eW
グラフかくのってどうしたらいい?gnuplotの🎺使うの?
gnuplot使ったことないけど難しいのか?
0199デフォルトの名無しさん
垢版 |
2020/04/29(水) 23:11:18.94ID:ALOjMFFX
>>193
"from the first elements to the last"は最初の要素から最後の要素へだから当然ながらin orderの意味を含む

もしも、上の表現を使ってin orderを保証しないことを意図する言語仕様があったら、
その言語仕様を書いた人間が英語(というよりも人間の使う言葉)の常識を知らないと言うべきレベルの代物

procの適用にin orderを保証したくないのならば"from the first elements to the last"などではなく、例えば
“(map) Applies proc to every elements of the lsts exactly once”とでも書くべき
というか、そもそもR5RSでのmapに関する表現をそのまま使えば良い


>>194
なるほど、インターリーヴを起こしてはならない、ということですね
良い反例ですね、了解しました
確かにそれだと並列処理という話は排除されますね
0200デフォルトの名無しさん
垢版 |
2020/04/30(木) 01:56:25.80ID:qpY4nJGd
実用性皆無の話だなschemeらしいや
racketとの比較ならr6だと思うのだが
しかもr7でなくr5とな
scheme間でさえ移植性は低いんだからどんな挙動でも良いんじゃねえか
racketはまだ実装が複数存在するような状況ではないらしいが
schemeとは文化が違うんで実用性に舵切った仕切りになりそうね
レスを投稿する


ニューススポーツなんでも実況