X



Lisp Scheme Part40 [転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん垢版2015/03/16(月) 13:45:52.92ID:EEYZoZ1i
Common Lisp、SchemeをはじめとするLisp族全般のスレです

■前スレ
Lisp Scheme Part39
http://peace.2ch.net/test/read.cgi/tech/1408017352/

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

■関連スレ
【入門】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】プログラミング言語 Clojure #3【JVM】
http://peace.2ch.net/test/read.cgi/tech/1380333808/
【魔法】リリカル☆Lisp【言語】
http://peace.2ch.net/test/read.cgi/tech/1183396621/
0110デフォルトの名無しさん垢版2015/06/24(水) 23:46:08.20ID:PBiySlld
試しに実装してみたぐらいの気がする。
継続して使うのに作ったかは分からない。


型付きといえばshenも、18.1で型チェックが速くなったらしい。
ソースみたら、該当箇所の型が総称型に変わってた。
http://www.shenlanguage.org
0114デフォルトの名無しさん垢版2015/06/25(木) 13:36:07.50ID:q+JEbLja
CL (というより動的型の言語) は LLVM の抽象度では上手く扱えないしたいして最適化できないという話もある。
GC の性能にも強く左右されるし、 LLVM よりも JVM の方が CL とは相性よさそうな気がする。
0116デフォルトの名無しさん垢版2015/06/28(日) 19:28:01.75ID:8Yznu8U0
昔,kawaからJavaを使おうとして非常に苦労した記憶が
ABCLならだいぶ楽にJavaが使えるのだろうか
Clojureは最初は楽だけどJavaのパッケージマネージャで苦労するね
0118デフォルトの名無しさん垢版2015/07/05(日) 11:29:59.98ID:dGwooAgp
一時期Clojureが過剰に持ち上げられていたけど
まったく流行らずに終わったな
0122デフォルトの名無しさん垢版2015/07/06(月) 14:46:34.49ID:Mc9Nlxok
やもえずJavaのウンコなプログラムのメンテしないといけない場合に
Clojureは便利だった

そういう制約ないならRacketが一番
0123デフォルトの名無しさん垢版2015/07/06(月) 16:16:59.97ID:VRJTYjkB
>>122
Racketの良さを教えて
0124デフォルトの名無しさん垢版2015/07/06(月) 17:47:41.11ID:Mc9Nlxok
srfiがみんな使える上に
pythonとも連携できる
jythonみたいにnumpyが動かないとかもない
0125デフォルトの名無しさん垢版2015/07/06(月) 18:34:53.65ID:VRJTYjkB
>>124
ありがとう
pythonライブラリを透過的に使えるなら便利そうだね
0128デフォルトの名無しさん垢版2015/07/06(月) 21:14:58.54ID:VRJTYjkB
自前でサーバー立てるなら何でもありだけど、実際PaaSのほとんどがJVM前提だからね
0129デフォルトの名無しさん垢版2015/07/07(火) 02:14:08.64ID:FANO5u+E
Javaでプログラム書く人達はユニットテストという概念がないらしく
csvに結果を書き出してエクセルで手作業テストを行うという謎慣習があるようだ

こういう人達の書いたJavaコードと付き合わざる得ない環境ではClojureは便利
0132デフォルトの名無しさん垢版2015/07/08(水) 00:15:24.50ID:j/rYw6w7
>>129
むしろ、java以外のユニットテストツールを使ったことがない
0133デフォルトの名無しさん垢版2015/07/18(土) 20:06:26.43ID:cOkep0vN
>強力なマクロシステムが特徴で、マクロを使って言語機能を拡張でき
このLISP系でよく言われる「言語機能の拡張」って全然的を射てねーなと思う
例えばschemeのファーストクラスオブジェクト(FCO)としての継続って
言語プリミティブとしてFSO継続相当を始めから持ってない限りはどうやっても
拡張で得ることはできないし
FCOとしての継続の無い言語から有る言語へ言語機能を拡張するってことは
つまり新規にFCO継続付き言語を作るって事に他ならない
できることは結局言語に既にある機能の延長上の事だけで
言語拡張なんて大それた事は他の言語同様できやしない
「子供騙しですけど強力なマクロシステムで俺構文糖衣が簡単に作れますんで・・・」
とちゃんと書き直した方がいいね!
「プラグインモジュールを使うと言語機能を拡張できます」とかで売った方がまだ納得できると
思わないかね君たち
0135デフォルトの名無しさん垢版2015/07/19(日) 00:51:10.84ID:yGfbtuav
おかしなひとには
かかわらない
しらんぷり
0140デフォルトの名無しさん垢版2015/07/19(日) 12:23:56.55ID:HOCsiBj3
>>133 みたいな勉強不足の人に黒板先生は本当に便利だ

http://cl-www.msi.co.jp/solutions/knowledge/lisp-world/articles/scheme

> 端的に言ってしまえば Scheme は Lisp ではないです。 この2つを混同するのは味噌糞いっしょ、ってやつで、つつしむべきです。

http://cl-www.msi.co.jp/solutions/knowledge/lisp-world/articles/script-lang

> Lisp の不幸の1つに、
> Lisp を使わない奴に限って Lisp について語りたがる
> というのがあるんですが、今回もう1つ加わったのは、
> Lisp を知らない奴に限って Lisp を他のもの、なかでも自分の自慰行為の結果と比べたがる
> Lisp の評論をとうとうとやるわけです。
0141デフォルトの名無しさん垢版2015/07/19(日) 12:48:48.02ID:UMlSSY6R
>>133
マクロは任意の構文木から任意の構文木への変換であって
どんなプリミティブが用意されるかは言語の戦略で決まること
レイヤーの違うことを関連付けて語るのはやめてちょうだい
0142デフォルトの名無しさん垢版2015/07/19(日) 13:33:11.61ID:4YSiYgLI
>>140
その理屈でいくなら、CommonLisp も Lisp ではありませんね
0143デフォルトの名無しさん垢版2015/07/19(日) 13:42:12.63ID:HOCsiBj3
>>142
それと >>133 とどんな関係が?
0144デフォルトの名無しさん垢版2015/07/19(日) 13:58:30.31ID:4YSiYgLI
>>143
Lisp と CommonLisp を混同しながら、Scheme はLisp ではないと主張ている人の意見はほどほどにして聞きましょう
0145デフォルトの名無しさん垢版2015/07/19(日) 14:18:17.54ID:HOCsiBj3
>>144
自身のLispの定義を明らかにせずにCommon Lispは違うって言われましてもw
でもCommon LispがLispでないんなら、なおさらSchemeでLispを代表させるような論が成立しないのは同意できるんでないの
0146デフォルトの名無しさん垢版2015/07/19(日) 15:30:05.25ID:4YSiYgLI
>>145
まず、Lisp は CommonLisp ではない
Lisp は Scheme ではない

次に
ttp://www.softwarepreservation.org/projects/LISP/book/LISP%201.5%20Programmers%20Manual.pdf
この↑Lisp1.5 は Lisp であるとする (おそらく、誰も異議をはさまないでしょう)

その上で、CommonLisp は Lisp であると仮定する (つまり、Lisp1.5 と CommonLisp程度の差があっても Lisp の一部であると仮定する)
当然、SchemeはLispである

逆に、SchemeはLispではないと仮定する (つまり、SchemeにもLisp1.5にもないモノがあればLispではないとする)
package にintern できる symbol がある CommonLisp は Lispではない

CommonLisp 側の言い分としては、CommonLisp はSchmeと同じくLisp系の新言語です
(Common Lisp is the modern, multi-paradigm, high-performance, compiled, ANSI-standardized, most prominent (along with Scheme) descendant of the long-running family of Lisp programming languages. )

Confusing Lisp and Common Lisp is permissible once in a human life. です

個人的には、マクロやシンボルが無くてもLispと呼ぶべきだと思います
0147デフォルトの名無しさん垢版2015/07/19(日) 16:16:48.77ID:heZn3Xco
>>140
このKURODA Hisaoって人が書いてる他のページも見たが
Abstract Syntaxの概念やこれを設定する意義を理解できない人がSemanticsについて語っても全く説得力がないね
それにSchemeの単一name space批判を自然言語での文脈依存性を持ち出してるが
自然言語の柔軟さというかいい加減さを至上の価値とするのならば所詮は知性ゼロ・常識ゼロのコンパイラやインタプリタですら処理できちゃう
普通のプログラミング言語なんてどれも失格、もちろんCommon Lispもね
理論や論理学について良く判っていない人間ほどFregeみたいな「計算機と深い関係があると世間で言われている」哲学者の名前を出したがる
0148デフォルトの名無しさん垢版2015/07/19(日) 16:17:03.59ID:OiytaaWT
 わりと
   どうでもいいよね〜                   ね〜♪
                         _ ‐..::  ̄ ̄ ::::... 、
              . ィ            r'::/ ::ィ:::::::::::j:::::::ヽ::::\
,._.._ .......、._    _ /:/l!            | ::|::/ |::::::::∧:::レ::l:::| :::::rヘ
ヽ :~""''.>゙' "~ ,、、''‐'、|          l ::仏_ノヘ:/ ー- ハ:::!::::::|::::i
 ゙、'、::::::ノ:::::::_,.-=.  _〜:、          /::::リy=ミ ' ィ=ミ /:::::!::::/:::::!
  ``、/:::::::::__....,._ `゙'Y' _.ェ-、..._      |::::{xx     xx/::::::「)'|:::::::|
  ,.--l‐''"~..-_'.x-='"゙ー 、`'-、      lハ:仆 ..._ヽフ /:::: /´ |:::::::|
 "   .!-'",/  `'-‐'') /\ `      Y::::ソ勺 7イV_  !:::::::!
  .-''~ >'゙::    ‐'"゙./  ヽ.    __  |::/ 爻___ん'´ッ'⌒ヽ! :::::!
    //:::::       ',        (__,、\/ /‐―一弋{、  /  ̄_)
   ' /:::::       .:';          \ ' {      :::\   /~::!
0151デフォルトの名無しさん垢版2015/07/19(日) 18:28:12.53ID:yGfbtuav
確かに言語拡張でarduinoと連携してドローンを自動航行できますとか言えた方がかっこいいよな
方言作れるとか書かれてもLisp界隈の事情知らん人間にゃ意味不明だし
0152SCHEME餃子 ◆8X2XSCHEME 垢版2015/07/19(日) 20:49:45.79ID:bZkSJoy2
>>151
バインディング書けば言語に関係なく出来るだろ。
その手のライブラリがたくさんあるとか、
コマンドひとつで導入できるエコシステムがあるとかならアピールポイントになるとは思うけど。
0153デフォルトの名無しさん垢版2015/07/19(日) 22:15:40.89ID:+t5BUUhH
言語は大きい会社や団体が開発してることがほとんど。なので妙な政治意図で故意に機能が削られたりが良くある。マクロありとこういうのは無視出来る。だいたいは誰かが便利なマクロを公開してくれる
0155デフォルトの名無しさん垢版2015/07/20(月) 01:22:41.63ID:8KYV1D+J
だって、>133の言い掛かりと言語レベルでの継続の必要性とは、まるで関係がないんだものw
0156デフォルトの名無しさん垢版2015/07/20(月) 02:49:25.74ID:kupXshGu
フル継続の後付けが難しいのは事実だろ。
cl-cont も Scheme に比べればモドキに過ぎないしな。

そんでもって >>133 は継続は例に出しただけで、
マクロによる拡張が容易であっても言語が持つべきプリミティブの選択が重要だってことじゃないのか?
0157デフォルトの名無しさん垢版2015/07/20(月) 17:42:45.96ID:aIRgWq4T
長々書いてるけどマクロでシンタックスを拡張できてもセマンティクスは変えられないってこと?
そりゃそうなんじゃない?この手の話の根はチューリング完全話と一緒だよね
機能拡張という言葉はセマンティクス拡張と同義ではないよなあ
0160デフォルトの名無しさん垢版2015/07/20(月) 23:07:56.79ID:kupXshGu
言語の意味論とシンタクス拡張はレイヤが違う話だよ。
DSL は言語の意味論を変えはしないけど系を作ることは出来る。

物理法則は変えられないけど、物理法則の範囲内でサッカーのルールを定義したとして、それが無意味って言えるか?
0161デフォルトの名無しさん垢版2015/07/21(火) 18:19:47.73ID:3UOplv+P
上の方の人と偶然被ってるけど、質問。
schemeのdefine-syntaxって何ですか?
defineじゃダメなの?
0162デフォルトの名無しさん垢版2015/07/22(水) 02:27:20.21ID:ta5d120D
Scheme のマクロは式の評価の前に展開される。
ものすごく単純化して説明すると処理されるタイミングが違うの。
0163デフォルトの名無しさん垢版2015/07/22(水) 10:24:48.10ID:4IMBgQFd
>>161
マクロなら可能だがdefineでは定義不可能なケースを上げておく

defineで定義された関数(procedure)の適用では、まず全ての引数が評価されてからその結果が関数bodyに渡されて関数の結果が決まる。
もし、全ての関数を評価せずに前から必要な分だけ評価する関数を書きたい場合、defineでは無理。その場合はdefineは-syntaxなどをつかってマクロを定義することになる。

マクロは
>>162が述べているように第一段階としてSchemeのS式を生成し、第二段階でその生成されたS式を評価するわけだが、第一段階ではマクロの引数は評価されない点が重要。
それによって、defieとは異なり一部の引数をのみ評価することが可能となる。

or関数はその一例だな
もしdefineでmy_orを定義しようとすると全ての引数を評価するという無駄な関数となるわけだ。
もしaがtrueなら
(or a b c d e)でb以下は評価不要
が(define my_or ……)とすると
aからeまでを必ず評価してしまう
0166デフォルトの名無しさん垢版2015/07/22(水) 13:29:11.06ID:wcjgZ6Dx
>>162でスゲーわかった気になったのに、>>163-164で全然わからなくなりました。
defineでも問題なさそうだけど。

(define my_or1
(syntax-rules ()
((_ a b) (or a b))))

(define-syntax my_or2
(syntax-rules ()
((_ a b) (or a b))))

(my_or1 #t (begin (print "!") #f)) ===> #t
(my_or2 #t (begin (print "!") #f)) ===> #t
0167デフォルトの名無しさん垢版2015/07/22(水) 21:13:51.17ID:ta5d120D
>>166
試した処理系は何? それは仕様上未定義だよ。
期待した動作をするように見えてもただの偶然。
0168デフォルトの名無しさん垢版2015/07/23(木) 00:05:16.72ID:a8nLYx9Z
全部(lambda()〜)で囲って遅延評価すればなんでもできるよ
SICPでマクロが無くても問題なかったのはこのおかげ
0169デフォルトの名無しさん垢版2015/07/23(木) 01:48:45.97ID:6c5WF/G8
>>167
gaucheっす。r[567]rsによると、my_or1はこう呼ぶべしと理解したけど、あってます?
(define my_or1 (syntax-rules () ((_ a b) (or a b))))
(let-syntax ((my_or1 my_or1)) (my_or1 #t (error "!!")))

変数と構文キーワードを区別しなきゃならない理由が、いまいちピンときません。
フォームの先頭が(lambda)を評価したものと(syntax-rules)を評価したもので
区別出来そうな気がします。(実際Gaucheはそうしてるから>>166で動いてる?)
0170デフォルトの名無しさん垢版2015/07/23(木) 02:53:10.55ID:kIXXXoPi
>>169
構文は第一級ではない。 (実行時に値として扱える存在ではない。)
「マクロ展開フェイズ」が完了してから「式の評価」を開始するので、実行時に束縛するのでは遅すぎるんだよ。

式ひとつごとに「展開」「評価」をする処理系でフェイズの分離を有耶無耶にしている処理系だと区別を曖昧にしてもなんとかなるのかもしれないが……
それは実装方針のひとつとしてそういうのもありえる、可能というだけ。
0175デフォルトの名無しさん垢版2015/07/29(水) 08:09:17.38ID:F/xNpz+P
ウェブブラウザから使えるのが lisp だったら流行ったんじゃないの?
とはいえそこに lisp が採用されない理由も結局は一緒か。
0176デフォルトの名無しさん垢版2015/07/29(水) 20:06:45.42ID:amFWHOPf
IE4やNN4で実装されたスクリプト言語がLISP系だったら…

少なくともfirefoxのnoscriptアドオンは不要だったろうな
0179デフォルトの名無しさん垢版2015/07/30(木) 00:29:45.75ID:5uamD/zW
Javaがダメ言語とあの時点で判明してればなあ。
当初の予定通りschemeが組み込まれてたに違いない。
0182SCHEME餃子 ◆8X2XSCHEME 垢版2015/07/30(木) 01:08:52.34ID:txS92Tc7
Emacs に Webkit 載せたりしてるのもあったぞ。
Emacs 側から Webkit をどれくらい操作できるのかは知らんけど。
0183デフォルトの名無しさん垢版2015/07/30(木) 03:10:36.45ID:qAED+lXR
ブラウザ競争っていかにCSSに意図通り対応してるかの勝負だし
サーバサイドならemacsでもjavaでも変わらん
0186デフォルトの名無しさん垢版2015/07/31(金) 01:38:43.67ID:aJuGxMgm
第一級の継続も末尾呼び出しの最適化もないしねぇ

手続きが無条件でクロージャになるってのがまあ当時としては特徴的ではあったけども
0187デフォルトの名無しさん垢版2015/07/31(金) 15:13:29.83ID:Dkg4afbG
CLみたいな余計な装飾子が無いところはschemeと考え方が近い
末尾最適化が標準のluaのがよりschemeに近い
継続は第一級にする必要ってあんのかな
使い所が難しいし言語に例外機構が備わってればいらないし
jsはライブラリ覚えるだけでもしんどい
0188デフォルトの名無しさん垢版2015/08/01(土) 07:34:04.74ID:qWCT4wa1
今JSがコールバック地獄になってるからこそ継続がほしいんじゃん。フル継続じゃなくて限定継続でもいいから。
0189デフォルトの名無しさん垢版2015/08/01(土) 10:30:34.72ID:c0YSrVc+
javascriptのように通信が頻繁に行われる環境で継続なんか入れたときに、例えば途中でブラウザを切ったときの継続がどうなってるのか考えるとワケ分からなくなる
schemeの継続ですら、資源を使いまくってるサーバが落ちたときにリソースのclose操作とかきちんと行われるのか不安になる
0190デフォルトの名無しさん垢版2015/08/02(日) 01:56:02.37ID:MF9TQU9s
>>188
jsはクロージャがあるからCPS方式で継続もどきは作れるんじゃないの
インスタンスが途切れちゃうなら継続使っても同じだし
0191デフォルトの名無しさん垢版2015/08/03(月) 18:40:37.91ID:zmSfrGKJ
>>190
CSP?
0193SCHEME餃子 ◆8X2XSCHEME 垢版2015/08/04(火) 03:41:56.42ID:T8IrycSA
JavaScript 処理系の Rhino は第一級継続を持ってる。 実在する以上、言語処理系レベルでは可能ってことだろ。
だけど、 Scheme 処理系でも外部のライブラリ (バインディングとか) を通過したところで継続が途切れてしまう制限を持っているものがあることからもわかるように、
継続が処理系の外の世界をまたぐのは難しいんだわ。
(※参考 Gauche のドキュメント http://practical-scheme.net/gauche/man/?l=jp&;p=call/cc )

JavaScript はアプリケーションに組込んで使うタイプの言語だから、当然、外の世界とのやり取りはあたりまえで、
そこに第一級継続を持ち込んでも途切れまくりであんまり役に立たんのじゃないか?

Gauche のドキュメントには限定継続の利用を勧めるようなことも書いてあるけど、
フル継続で途切れてしまうところを越えられるって意味ではなくて、
継続の範囲を明確に書けるから変なところをまたがないように注意しやすいって意味だと思う。
0200デフォルトの名無しさん垢版2015/08/06(木) 23:18:25.94ID:FMimP/gx
unicodeサポートが微妙だったのはもう昔の話なのかな?なんかそれで使うのやめた事がある
0201はちみつ餃子 ◆8X2XSCHEME 垢版2015/08/07(金) 01:10:45.06ID:p6pvn2Md
アプリケーションに組込むなら小さい実装の方がいいよな。 Guile は豪華すぎると思う。
かといってリッチな実装というカテゴリだと Racket が強いから Guile は微妙ということに……。
Guile の強みって何?
0202デフォルトの名無しさん垢版2015/08/07(金) 01:54:27.51ID:JnTUt1UO
javascriptでscheme組もうと思う
クロージャあるし継続なしで末尾再帰ぐらいなら結構楽勝かな
0205デフォルトの名無しさん垢版2015/08/12(水) 16:29:28.90ID:lGV/dlKr
racket で raco を使って exe 化したらやたらサイズがデカいのが出来たんだけど、
もっと小さくできないものなん?
0206デフォルトの名無しさん垢版2015/08/12(水) 23:13:39.90ID:G8qcToBK
自作処理系だと4KBセクタに収まるようにできる
512バイトブロック単位だが
けどschemeコアも含めたりすると結局数十KBにはなる
イメージまるごとexeにするタイプなら
参照切りまくれば小さくなるんじゃないの
■ このスレッドは過去ログ倉庫に格納されています

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