Lisp Scheme Part40 [転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん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/

460デフォルトの名無しさん2016/08/24(水) 22:03:15.08ID:kzFjQi4C
>>459
> clojureは組み込みデータ型がJVMに寄ってるので、cljsもclojureclrも組み込みのデータ型で苦労してるし、clrは特にサードパーティーのライブラリが対応してなくて苦労してる。

なんでそういう勘違いしてるのか気になるな
clojureの組み込みリテラルは数値、シンボル,キーワード、文字列、キャラクタ、list、vector、dictionary(map)とsetでCLRでも問題無い奴しか無いよ

> clrは、unity使えるけどスマホで使えないし、WPF対応させたりしてるけどクロス環境では使えないみたいな話も。
スマホはiOSが実行時評価禁止してるからunity上でのclojure.clrは制限があるのは事実だけど、これも誤解が入っていると思うぞ

> JVMは末尾再帰辛いけどindyやgraalvm+truffleみたいにネタが増えてて実装オタク向けの新しい題材が増えてるし、他のVMでも.netよりもerlangのvmや、llvmあたりの方がまだ活発なイメージがある。
JVMは末尾再帰を完全に保証できないからclojureのrecurが生まれたのだけど、順序間違ってない?

461デフォルトの名無しさん2016/08/25(木) 03:01:28.74ID:EcGIN1F9
フォローありがとう。
unity+clojureclrってiosで動くようになったのか。

javaの規格では末尾再帰最適化はないけど、
ibmのj9 vmでは、末尾再帰最適化してくれる。

462デフォルトの名無しさん2016/09/12(月) 17:44:10.20ID:qDbI1d2i
S式はいつまで日陰なのか
なんでXMLは普及したのか
XMLの前身のHTMLはなぜS式ではなかったのか
無茶苦茶汚くなるスクリプト埋め込みやCSSとかをなぜ苦労してまで使うのか
そんなにS式が嫌か

463デフォルトの名無しさん2016/09/12(月) 18:18:05.53ID:q3qEXh1t
手習いの推薦図書で興味を惹かれたんだけど
物まね鳥きちんと読むと、どうなるの?
Lispをやるのにどんなご利益があるの?

464デフォルトの名無しさん2016/10/08(土) 11:21:36.68ID:fiaM9vLl
>そんなにS式が嫌か
はい

465デフォルトの名無しさん2016/10/08(土) 12:09:44.18ID:1yrGmOsT
括弧の対応わかんなくてインデントで対処したら
だったらインデントあれば括弧いらなくね?ってなって
いまでは立派なHaskeller

466デフォルトの名無しさん2016/10/08(土) 17:17:37.57ID:4LO02OW+
ごめんなさい、殺さないで

467デフォルトの名無しさん2016/10/08(土) 20:59:11.69ID:MxYncUTD
にわかHaskellerだけど立派ではないだろ盛るのもいいかげんにしろ

468はちみつ餃子 ◆8X2XSCHEME 2016/10/08(土) 21:05:09.85ID:vq0777oC
Gauche 0.9.5 出たよー

469デフォルトの名無しさん2016/10/09(日) 01:16:51.64ID:0XqPv4tB
いつまで0.9彷徨ってんだよ
そんなハードル高く設定して何になる

470デフォルトの名無しさん2016/10/10(月) 23:42:14.48ID:goEL863s
今のバージョンを何と呼ぼうと手に入る機能は変わらないのに、バカなの?

471はちみつ餃子 ◆8X2XSCHEME 2016/10/13(木) 14:55:07.45ID:j1zwT3+2
ナンバーが 1 未満だと未完成という印象になっちゃうのかな?
バージョンナンバーの振り方はそれぞれのプロジェクトでのポリシーで決める話。
Gauche の場合はこういうマイルストーンが設定されてる。
http://practical-scheme.net/gauche/devinfo-j.html

たぶん作者が考える一通りの機能がこれだけということではあるんだろうけど、
バージョン 0.9.5 は 0.9.5 という完成品だし、 1 を過ぎたからってそれで終わりってわけでもない。
所詮は一区切りの目安。

472デフォルトの名無しさん2016/10/13(木) 19:48:53.96ID:PkuNke6K
セマンティックバージョニングみたいなのがあるし、最近だと1.0を出さないのは個人で開発してるとおおいのかな?
昔はtexみたく収束していく系やってる人は多かったけど、やっぱり個人かね。

473デフォルトの名無しさん2016/10/14(金) 01:22:40.11ID:XWvLcjKQ
というかそのドット別に小数点じゃないし・・・
混同するのは間違いないのでいっそコロンやセミコロンで区切ったほうが理解しやすいかもしれない

474デフォルトの名無しさん2016/10/14(金) 10:16:22.13ID:vLfiDK4O
いや、本来は小数点だったよ
「0.9の次だけどまだ未完成だから0.10にしたよー」とかやらかしたから信用を失っただけで

475デフォルトの名無しさん2016/10/14(金) 18:32:55.43ID:7nOZHdhP
>>474
具体的なソフト名挙げろや。普通 0.91 とかに行くだろ。

476デフォルトの名無しさん2016/10/14(金) 19:07:47.56ID:zN4aic2C
社内業務ソフトですらバージョン番号が0.xなのってざらだと思うのだけどなぁ
1.0ってほぼこれで完璧的な意味で付ける会社もあるだろうし
(売り物のくせにVer 3の倍数から完璧の会社もあるけど:老舗のOS屋さんとか)
なお、1.0以降になるとちょっと仕様が変わっただけでメジャーバージョンが上がる会社もあるけど(猫科の動物の名前付ける所とか:Ver 9までクソだったような気もするけど)

ようするにバージョン番号って作者が自由に付ける物じゃないの?

477はちみつ餃子 ◆8X2XSCHEME 2016/10/14(金) 19:53:07.72ID:njZqyYby
>>476
自由でいいけど、ひとつのソフトは一貫した (わかりやすい) ルールを持っておいてほしくはあるね。

478デフォルトの名無しさん2016/10/14(金) 21:35:46.95ID:5nO9NwFR
まあ linux もいきなり 3.x になったり,よく分からない理由で 4.x になったり

479デフォルトの名無しさん2016/10/14(金) 21:53:32.26ID:SkqOUpcH
Windowsも10になったけど中身は8なんだろ?

480デフォルトの名無しさん2016/10/15(土) 10:14:21.43ID:C9liqmNs
0-originでバージョン付けたっていいじゃない。

481デフォルトの名無しさん2016/10/15(土) 21:27:25.53ID:bOlsxR9R
0.x.yは劇的な変更があっても泣くなよ、という意味合いだと思っている

個人的にはセマンティックバージョニングを付けてもらえるとありがたい
1.x.yなら、機能追加でxを1つ増やして、バグ修正でyを1つ増やすってやつ
0.a.bは開発途中だから後方互換性は無くてもいいので、開発者が試行錯誤しているうちは1未満だとはっきり分かる

firefoxやchromeの馬鹿みたいなバージョン上げはマーケティングの意味合いが強くて好きになれない

482デフォルトの名無しさん2016/10/15(土) 22:15:44.10ID:pvROaeUb
つーても実際非互換変更頻繁に入るから厳格に管理する意味ないだろ

483はちみつ餃子 ◆8X2XSCHEME 2016/10/16(日) 02:21:56.19ID:5wsvLL7T
仕様バグの修正なんかだと、バグ修正でもあるし、非互換な変更でもある。
ライブラリのバージョンにセマンティックバージョニングを採用した場合、
パッチバージョンの変更があったときにそのライブラリを使うアプリケーションが本当に正しく動くのかは
厳密にいえばライブラリの個別のバージョンを確認しないとわからんだろ。
あまりあてにならない。
ライブラリにバグがあってもそのバグの挙動に依存しているアプリケーションだってありうるわけで。

目安としてセマンティックバージョニングを導入するのは賛成だけど、厳密にしきれない部分はどうしてもあるわな。
そこらへんは柔軟に対処するしかしゃあねぇべ。

484デフォルトの名無しさん2016/10/16(日) 09:37:20.54ID:PjXU2mUU
>>482はJSブラウザエンジンの話な
何にしても各言語なりの界隈の慣習に則ればいい

485デフォルトの名無しさん2016/10/16(日) 18:47:56.29ID:dK/+e+o+
>>479
Windows8.1までは6.3とかだったけど
10は10.0が返ってくる

486デフォルトの名無しさん2016/10/17(月) 06:02:40.67ID:IeaGZ3RQ
そういうことにしちゃっただけで、実質8.xx(6.xx)みたいなもんでしょ

487デフォルトの名無しさん2016/11/15(火) 14:34:16.46ID:rex6X+v0
http://lipn.univ-paris13.fr/~bennani/CSRank.html
コンピュータ関連国際会議ランキングをlispで検索すると
European Lisp Workshop
しかなかった

488デフォルトの名無しさん2016/11/15(火) 22:07:24.81ID:Ei/g+r4v
https://en.m.wikipedia.org/wiki/International_Conference_on_Functional_Programming
時代の流れにより96年にFPCAとLFPがICFPに置き換えられた。

489デフォルトの名無しさん2016/12/07(水) 03:48:27.70ID:tATsD5IS
これがリストのランクcにすら入ってないのは何故
もうじき締め切りだけど
http://www.european-lisp-symposium.org/

490デフォルトの名無しさん2016/12/07(水) 10:57:02.71ID:IYOLLYww
何か革新的な話題無いの?

491デフォルトの名無しさん2016/12/08(木) 08:26:21.07ID:v+J3OHGS
Anything.el再起動と革新的話題では?

492デフォルトの名無しさん2016/12/15(木) 23:40:28.38ID:Z/98FfuD
>>462
つ WebAssembly

493デフォルトの名無しさん2017/01/25(水) 16:59:16.79ID:IDNrNCFj
>>492
命令セットの検討を優先したからとりあえず柔軟なS式ということにしただけで、
ずっとあれを使うつもりはないみたいだよ。

494デフォルトの名無しさん2017/01/25(水) 17:18:28.01ID:IDNrNCFj
ところで R7RS-Large は Red Edition (データ構造に関する部分) がワーキンググループの Wiki に上がってる。

http://trac.sacrideo.us/wg/wiki/RedEdition

ほぼ SRFI から名前を変えてそのまま導入する形になる模様。
今のところ Sagittarius が積極的にサポートしている。

http://compassoftime.blogspot.jp/2017/01/r7rs-large.html

Larceny もライブラリの名前を除いてサポートできているとのこと。

495デフォルトの名無しさん2017/02/12(日) 07:48:00.04ID:fljd0HzI
並列処理で高速化できるlispってないの?
GPU使えるのはハーランだけ?

496デフォルトの名無しさん2017/02/13(月) 18:51:16.49ID:tGnu7zYw
>>495
高速ブン回しと違うけど、Lisp Flavoured Erlangとかだめ?
ttp://lfe.io

497デフォルトの名無しさん2017/02/13(月) 19:49:20.99ID:19NXxZ/v
これはclojureの資料だけど、いまのところfloatをSSE2に投げるみたいな、なんでもGPUに投げるみたいな仕組みはないんじゃないかな。

http://dragan.rocks/talks/EuroClojure2016/clojure-is-not-afraid-of-the-gpu.html

498SCHEME餃子 ◆8X2XSCHEME 2017/02/13(月) 20:41:00.93ID:B8yZNpnE
ある程度大きな単位でならバインディング作って投げてしまえばいいんだけど、
ちまちまやると境界を超える部分のオーバーヘッドで逆効果になったりするので、
本格的にやろうとすると処理系自体がサポートする必要はあると思う。

499デフォルトの名無しさん2017/02/17(金) 09:12:11.58ID:SQwgU5dB
Racketのプログラムを並列化して高速化したい。ハーランに書き直すのが1番手間かからずに高速化できるのだろうか

500デフォルトの名無しさん2017/02/23(木) 05:43:04.17ID:hf6cZ/5o

501デフォルトの名無しさん2017/03/04(土) 17:46:48.41ID:ASS1Dwl9
『scheme手習い』読み始めた
この本自体はめっちゃ面白いけど実際に自分のPCでschemeを走らせる方法が全く分からないのはどうすれば

502 ◆QZaw55cn4c 2017/03/04(土) 17:50:05.86ID:bKHrRL1/
>>501
goche を入れればよい

503デフォルトの名無しさん2017/03/04(土) 18:14:56.86ID:ASS1Dwl9
>>502
ぐぐったらGaucheじゃないかってGoogleに怒られた
チュートリアルがないみたいだけど絶版の『プログラミングGauche』を買った方がいいの?

504デフォルトの名無しさん2017/03/04(土) 19:28:05.44ID:cw8QUsOc
プログラミングGaucheはそろそろ次版が欲しい

505デフォルトの名無しさん2017/03/05(日) 09:40:39.32ID:ZY1iiKPn
>>501
特にこだわりが無ければ、Racketが最も簡単なのでおすすめ。
ダウンロードしてインストールするだけでプログラミングに必要な環境が全て整うぞ。

506デフォルトの名無しさん2017/03/05(日) 15:16:43.40ID:g3CQlQFl
>>505
簡単でいいね
言語選択はR5RSでok?

507デフォルトの名無しさん2017/03/05(日) 18:35:17.08ID:PeNyQ7CN
>>506
オッケー

508SCHEME餃子 ◆8X2XSCHEME 2017/03/06(月) 19:02:32.45ID:4f//mV7K
個人的にはそろそろ R7RS (の処理系) を前提にしてもいいんじゃないかと思ってるが、
総合的な開発環境の便利さとしては Racket が優勝だわな。
少なくとも初心者にすすめられるものとしては。

509デフォルトの名無しさん2017/03/07(火) 15:34:16.05ID:d/UktTsb
>>508
> 個人的にはそろそろ R7RS (の処理系) を前提にしてもいいんじゃないかと思ってるが、

R7RSはsmallの範囲は言語仕様書のドラフトが提出されたというのを何かで見た覚えがあるが
R6RSで巨大化した範囲に対応largeの部分の仕様書はドラフトでも出たのか?
あれがまとまるとは思えんのだが

それに処理系側もR7RSへの対処は結局はsmallだけへの対応で終わる…R6RSが処理系屋からほとんど無視されたように…のでは、と
個人的には予想している
そしてその予想が正しいならば、R5RS対応の処理系を使う前提で十分な気がする
(R7RSで言語仕様をsmall/largeの2階層モデルにした意図が、Come back! R5RS! Good bye R6RS! X-p にあるのは明らかだからね)

510はつみつ餃子 ◆8X2XSCHEME 2017/03/07(火) 15:59:23.09ID:Jusdeq18
>>509
Large の状況については >>494 の通り。
全部の議論が終わるのはまだかなり先のことになるだろうし、
処理系の対応がどうなるかはまだなんとも言えないところはあるのは確かだと思う。
でも、 R7RS Small については R5RS を少し拡張するにとどまったからこそ、
その程度の小さな差を導入することをためらわなくていいんじゃないかという意図だった。

R5RS でも十分といえば十分なのかもしれないけど
特にライブラリなんかは結局のところ R5RS 処理系でもそれぞれの処理系ごとに機構を持ってたりするし、
SRFI を使ったりするときに統一的な書き方ができた方が教える方もやりやすいよ。

511デフォルトの名無しさん2017/03/07(火) 16:36:42.01ID:d/UktTsb
>>510
詳しい説明どうもありがとう
なるほど、そういうことですか、了解しました

512デフォルトの名無しさん2017/03/27(月) 00:34:43.57ID:vvNcurYK
ここはスレチかもしれんがGo言語の勉強兼ねてR7RS片手にScheme処理系組んでみようとしてるけどトークナイザ書くの面倒すぎて心折れそう、お前らどうやってコード書くモチベ維持してるの?

513デフォルトの名無しさん2017/03/27(月) 11:59:36.16ID:rJ5GwHyl
schemeレベルで面倒つったら他の演算子入りの言語じゃどうなるんだ

514デフォルトの名無しさん2017/03/27(月) 12:19:08.00ID:wLrtvEW7
トークナイザなら特に変わらん

515はつみつ餃子 ◆8X2XSCHEME 2017/03/27(月) 13:04:02.91ID:X8O8C+77
>>512
最初から完全である必要はないよ。
数値を整数だけにして文字列や識別子のエスケープも全部省略くらいのものから始めたらいいと思う。
限定的にでも動くものが目の前にあればモチベーションを維持しやすい。

516デフォルトの名無しさん2017/03/27(月) 16:27:52.97ID:do2TA6Gp
>>515
なるほど、とりあえず簡単なとこからやるか

517デフォルトの名無しさん2017/04/02(日) 12:22:30.38ID:aBxOBDdQ
通常のletのように使うだけでgensym済みのlet文を生成するマクロ用コードを作ったのですが、このような挙動をする関数名を教えてください。
(let ((foo (gensym))) `(let ((,foo ,x)) ...)

(my-let* ((foo x)) ...)
と書ける感じです。再発明でなく役立つのであればここにCC0で貼りたいです。

518デフォルトの名無しさん2017/04/02(日) 12:34:36.86ID:3lfrxhSb
On Lisp に with-gensyms っていうマクロが載ってるけど、
それとは違う?

519デフォルトの名無しさん2017/04/02(日) 12:49:44.85ID:aBxOBDdQ
with-gensymsではたぶんこうなると思います。
(with-gensyms (foo) `(let ((,foo ,x)) ...))

520デフォルトの名無しさん2017/04/02(日) 13:06:11.52ID:aBxOBDdQ
突然死しないうちにとりあえず貼りますね。
アカウントは消すのでいいものであればbase64で書き残します。
ttps://gist.github.com/lla/f9244aefb7eee18db4cd

521デフォルトの名無しさん2017/04/02(日) 19:23:02.31ID:28FWzFad
レキシカルスコープのletやlet*でgensym必要なの?
使い道が良く判らない

522デフォルトの名無しさん2017/04/03(月) 10:05:01.53ID:+t4V64u5
こういう時に要ると思うのですが...。要りませんか?
ttp://www.sampou.org/scheme/t-y-scheme/t-y-scheme-Z-H-10.html#node_sec_8.2

523デフォルトの名無しさん2017/04/03(月) 15:23:03.92ID:dRI+3qaq
要るよ

524デフォルトの名無しさん2017/04/03(月) 21:22:49.93ID:e3RabMtG
`((lambda (foo) ...) ,x)と展開すりゃ要らないんじゃないの

525デフォルトの名無しさん2017/04/03(月) 21:45:51.66ID:hrRYx8PC
schemeでは衛生マクロを使うので不要だと思います。
commonlispでも仕様が中途半端なので不要だと思います。
そのまま書くのと手間が変わらないですし。

526デフォルトの名無しさん2017/04/04(火) 12:16:18.07ID:ugpuQ2R8
バカにマクロは無理だと何度

527デフォルトの名無しさん2017/04/04(火) 16:11:24.87ID:L5RxkvgF
(define-macro (my-or a b) `((lambda (x y) (if x x y)) ,a ,b))

>>524 こうですか? 副作用に対してはより良いと思いますが、関数化した時lambdaが二重になって連続使用した時嬉しくないと思います。

>>525 仕様が中途半端という点、gensymのプレフィックスがないこと以外で何か不都合の起きる文があれば知りたいです。それともgensym名の変数は込み入った文や副作用でセットすることが多く、最初に全てのシンボルに値を入れられると不便ということでしょうか?
 ネストが一つ減る程度の関数は不要ですか?

528デフォルトの名無しさん2017/04/04(火) 16:15:12.41ID:BUhgl6Ma
そもそもgensymがなんで必要なのかを理解しているのかという

529はつみつ餃子 ◆8X2XSCHEME 2017/04/04(火) 16:56:46.16ID:qLzzmr/Y
>>524
要るよ。

530デフォルトの名無しさん2017/04/04(火) 22:10:42.70ID:QobCLqKi
>>527 once-only っていう定番マクロしらないの?
(defmacro square (x) (my-let* ((g x)) `(* ,g ,g)))
(defmacro square (x) (once-only (x) `(* ,x ,x)))
それは中途半端なonce-onlyの再発明なんよ

531デフォルトの名無しさん2017/04/05(水) 11:30:15.85ID:must9X5J
and や orって短絡評価な気がして>>527はもやもやする
それと副作用のある式を同一式に並べるのは未定義だった気がする

532デフォルトの名無しさん2017/04/05(水) 11:40:21.51ID:0wF5qf+D
>>530
素敵です! ありがとうございます! これが探し求めていたものです。より良いものがあることを願っていました。

533デフォルトの名無しさん2017/04/05(水) 11:59:09.52ID:FrHqCsnx
>>531
確か評価順が未定義なだけ。

534デフォルトの名無しさん2017/04/05(水) 12:49:06.15ID:must9X5J
((a b c) d)の評価順序は
a b cの順序は決まってなくて(a b c)の後にdが評価されるのだけは保証されている。で合ってるよね?
もちろんマクロや特殊形式の引数は除外だけど>>527の展開結果は(a b c)と同じことになってる

さらに(or a b c)ならaがtrueの時点で評価打ち切りでb cは評価されない(短絡評価)
(or a b c)がマクロなら以下のように展開されないといけない
((lambda(x k) (if x x (k))) a (lambda() ((lambda(x k) (if x x (k))) b (lambda() c))))

535デフォルトの名無しさん2017/04/05(水) 12:51:42.98ID:must9X5J
>a b cの順序は決まってなくて(a b c)の後にdが評価されるのだけは保証されている。で合ってるよね?
これ合ってないわ。評価されるからそれを見越して>>534の最後のように遅延評価を入れとくって話
もういいです。

536デフォルトの名無しさん2017/04/05(水) 12:59:10.45ID:must9X5J
評価されるから、じゃなくて評価の順序が決まってないから
それを見越して無引数lambdaを1つ挟む必要があるだった。

537デフォルトの名無しさん2017/04/05(水) 13:01:01.45ID:must9X5J
気持ち悪いからまとめると、
((a b c) d)のa b c dの評価順序は何も決まってないから気をつけてねって事。

538デフォルトの名無しさん2017/04/05(水) 15:11:50.69ID:I9ofuKtd
最初の要素を最初に評価しないとマクロかどうか分からないかと思ってたが、その前の段階でマクロかどうかを判断することができるらしいんで、仕様では決まってないのか
((begin (display "1st\n") +) (begin (display "2nd\n") 2) (begin (display "3rd\n") 3))
をchezとgaucheで評価したら
2nd
3rd
1st
5
って順番だった。guileやchickenだと
1st
2nd
3rd
5
って順番になる。

539はつみつ餃子 ◆8X2XSCHEME 2017/04/05(水) 16:19:09.69ID:Paj3QjV7
最適化や諸々の都合で、同じ処理系でも順序が変わることはあるので、
単純な事例だけでは処理系の性質を推し量ることは出来ない。

540デフォルトの名無しさん2017/04/05(水) 17:06:07.45ID:0wF5qf+D
(define-macro (my-once-only1 x . body)
(let1 tmp (gensym)
`(glet1 ,tmp ,x
(let1 ,x ,tmp ,@body) )))

(use srfi-1)
(define-macro (my-once-only vars . body)
(let ((names (map (lambda (_) (gensym)) vars)) )
`(glet* ,(zip names vars)
(let ,(zip vars names) ,@body)
) ))
念願のものが作れました…。これで心残りはありません。

541はつみつ餃子 ◆8X2XSCHEME 2017/04/05(水) 20:28:07.58ID:Paj3QjV7
Scheme でやるなら syntax-rules でやったほうが楽だと思うが。

542デフォルトの名無しさん2017/04/06(木) 03:23:23.24ID:A4tBLGW+
>>533
> >>531
> 確か評価順が未定義なだけ。

少なくともSchemeではandやorでの式の評価順序は未定義でなくは左から順番に評価すると一意的に規定されているぞ
CLはどうだが知らんが

543デフォルトの名無しさん2017/04/06(木) 07:25:30.75ID:/2aNxn9F
>>542
そうだった。間違えた。
未定義なのは関数呼び出しの引数の評価順だね。

544デフォルトの名無しさん2017/04/06(木) 16:32:44.68ID:R/lK+iME
やっとリスト処理に慣れてgensymであーだこーだしてる人にsyntax-rulesは敷居高いと思う

545デフォルトの名無しさん2017/04/06(木) 16:36:20.16ID:sOUw0TpV
syntax-rulesはR7RS眺めてもよくわからんかった

546デフォルトの名無しさん2017/04/06(木) 18:46:00.39ID:b3KdhuXf
むしろSchemeから学ぶとマクロ入門にはsyntax-rulesしか書いてなくてdefine-macro&gensym触る機会が無かった

547はつみつ餃子 ◆8X2XSCHEME 2017/04/06(木) 21:09:32.30ID:HwCzkOKu
伝統的マクロの方が動作モデルを想像しやすくはあるかもね。

548デフォルトの名無しさん2017/04/13(木) 05:14:19.83ID:x8ZfQnJg
Racketは死んだ

549デフォルトの名無しさん2017/04/13(木) 16:03:04.54ID:RXvGitp8
>>546
> むしろSchemeから学ぶとマクロ入門にはsyntax-rulesしか書いてなくてdefine-macro&gensym触る機会が無かった

>>547
> 伝統的マクロの方が動作モデルを想像しやすくはあるかもね。

Schemeの場合、何でもありのマクロを排除して意味や動作を形式的に定義でき、
展開結果の正しさ(変数が展開したとたんに突然バインドされたりしない等)を保証できる範囲に留めたいという発想が
根底にあるからね

だからsyntax-rulesなどSchemeでの「マクロ」はあくまでも構文の拡張(カスタマイズ)のためなんだよね
つまり字句レベルを勝手に弄らせるとどんなトラブルでも起こし得るから勝手に弄らせたくたくない、
プログラマがお好みの構文を既存構文を使って定義して追加したいというならそれは許してあげよう
(例えばCみたいにwhile文…ループ条件の判定が最初に行われる構文…がある言語にrepeat〜until文を追加したいなら
許してあげように相当)というのがSchemeの基本的なスタンス

つまり、Schemeの場合はソースレベル(テキストレベルと言っても良い)で好き勝手な操作を許す本来のマクロ
(ソースコードレベルのメタプログラミング手段)でなくて、抽象構文レベルでの変換規則を定義し使用する範囲だけに
限定しているんだと考えれば良いと個人的には思ってるけどね

だから(メタ)プログラムの動きで理解するタイプの人(プログラマには多い、特に優秀な人ほど)にとっては
古典的なマクロのほうが却って理解しやすく、逆に理屈が好きで系統的に理解したがる(代わりにプログラムの腕は
さほどでないのが多い)人間にはSchemeの構文拡張のほうが理解しやすくそちらを好む人が多い

もっともsyntax-rulesとかを提案して実現した向うの連中はプログラミングの腕力も上級者以上ばかりだけどね
(でも殆どの凡人は、プログラミングの腕か理屈かの高々どちらかしか得意でない、まあだからこそ凡人なわけでして
どっちも両立できちゃったらGuy Steele, Jr.みたいになれちゃうよね)

550デフォルトの名無しさん2017/04/13(木) 16:37:53.95ID:UOOoC4Ge
syntax-rulesの動きがよくわからなくて理解できなかったけど古典的マクロなら単純で理解しやすかったな、準クォート使えば面倒でもなかったし(プログラムの腕はだめです)

551デフォルトの名無しさん2017/04/13(木) 21:50:42.52ID:KIw0CyXw
>>549 あくまでも構文の拡張のため
他のlispでもそうでしょ.具体的にそれ以外の他になにがある?

552デフォルトの名無しさん2017/04/14(金) 01:29:59.73ID:ktX2OX7O
>>551
他のLispに限らずマクロは構文の拡張と言えるほどの系統的な代物にはなってないでしょ
だからマクロを展開した途端にグローバルだったはずの変数が束縛されてローカルな変数に化けたりする(変数のキャプチャね)
つまり通常のマクロは(必要に応じて実行時と同じ計算も許して)ソーステキストという文字列データを処理しているだけ

それに対してsyntax-rulesなどに代表されるSchemeのは抽象構文上での操作とすることでテキストという文字でなく構文の句構造のレベルで扱い
変数のキャプチャなどを起こさないように保証するわけだ

ソースコードを文字データとして処理するのか句構造として処理するのかでは考え方も保証できる正しさや展開の安全性も全く違う

553デフォルトの名無しさん2017/04/14(金) 02:55:56.83ID:f5XItAeI
>>552
> lispマクロは構文の拡張と言えるほどの系統的な代物にはなってない.
そんなお前定義しらんし,そんならsyntax-rulesも違う.
はなしが無限退行しそうだからもういいわ.

554デフォルトの名無しさん2017/04/14(金) 03:00:40.04ID:obKv6Nr0
Common lispにschemeのmatchマクロを移植したのないのでしょうか?

555デフォルトの名無しさん2017/04/14(金) 07:39:01.84ID:a6xDhPFv
さあ、わかんなくなってきました。
とにかくsyntax-rulesの方が高級で、実装がめんどくさくて、低機能で、とりあえずほとんどの用はたりる。

556デフォルトの名無しさん2017/04/14(金) 20:02:05.16ID:E0l2Apap
そのめんどくさいの一点だけでLISP系にsyntax-を導入する価値は微妙
パターンマッチだからLISPじゃなくていいわけよね
syntax-rule/caseを日本語で詳細解説した本とかWebページってない?

557デフォルトの名無しさん2017/04/14(金) 20:06:23.95ID:E0l2Apap
なんだっけsyntax-rule/caseの他にもう2つぐらい別種があるんだよね
重複しないシンボル名の管理の観点では手間は同じだけど概念的にはより簡単な感じだったと思う

558デフォルトの名無しさん2017/04/15(土) 09:36:50.92ID:MGc4G7Yt
case は削除されなかった?他の2つも結局どうなったんだか

559はつみつ餃子 ◆8X2XSCHEME 2017/04/15(土) 11:21:48.74ID:7hkWD0i5
>>556
> そのめんどくさいの一点だけでLISP系にsyntax-を導入する価値は微妙

一概には言えない。
たとえば letrec のようなものをマクロで書こうとするとフォームを分解したり
衛生的にしたりする処理はいずれにしても必要なことで、
それを自動的にやってくれる syntax-rules だと簡単に書ける。

syntax-rules や syntax-case は言語のプリミティブな機能としては高級すぎるのは確かで、
これは低水準の部分でどのパラダイムを採用するかで意見が一致しなかった末の妥協案として
いきなり高級な機能を持ち込んだ結果。

参考: http://blog.practical-scheme.net/shiro?20100425-scheme-macro

実際の処理系では explicit renaming や syntactic closure を基礎に据えてその上に
syntax-rules や syntax-case のインターフェイスを実装している場合もよくある。

■ このスレッドは過去ログ倉庫に格納されています