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/
0456デフォルトの名無しさん
垢版 |
2016/08/23(火) 19:12:17.79ID:UTRMGA4h
ttps://github.com/clojure/clojure-clr
clojureは.net版もあるね,JVM版とバージョンは一緒だけど
clojureでよく使われているプロジェクトはjavaライブラリのjarに依存してるのも多いからどうなんだろ?
0457はちみつ餃子 ◆8X2XSCHEME
垢版 |
2016/08/24(水) 15:03:29.26ID:nZ9rDf/L
>>453 について意見した >>455 にもうちょっと意見を付け足し

どちらを軸にするかという問題だから、
Java の世界を軸にすれば厳密に Scheme の仕様に従おうとするといまいちなところは出てくるだろうし、
Scheme の仕様を軸にすれば Java (JVM) のデザインがクソザコに思えたりもするだろう。

Scheme からでも Java やら dotNET の機能は呼び出せるが、
単に呼び出せるというのと全体として違和感なく統合されているというのは別物なので、
dotNET ユーザにとっては dotNET の世界に合わせた LISP が欲しいというのは納得のいく意見だと思う。

でもそこで Scheme を引き合いに出されると違和感あるわ。
Gauche は別に dotNET を想定してデザインしたわけじゃないしハナから Scheme 処理系なんだから
軸足は Scheme にあるわけで dotNET 的に制約に感じられても当たり前の話。
勝手な評価軸で「アホらしい」なんてのはそれこそアホらしい。
0458デフォルトの名無しさん
垢版 |
2016/08/24(水) 18:47:43.67ID:urM54ZXn
.netはc#,f#に集約されているので、S式使った組み込みDSL向けか、replなどのユーティリティー系しか用途がない気はする。

最近はnotebook形式のツールが増えてきたので、そっちも限られてきた気はするが。
0459デフォルトの名無しさん
垢版 |
2016/08/24(水) 18:56:20.06ID:urM54ZXn
.netはDLRが出た時に.net言語の実装増えたけど、利用者少ないし、ほとんどがメンテできてないんじゃないかな
JVMだと使える処理系としてkawa、abclもメンテされてるはず。
それとリッチ・ヒッキーは.netでscheme実装やってみたけど、意図的にclojureからjvmに移行したという記憶が。

clojureは組み込みデータ型がJVMに寄ってるので、cljsもclojureclrも組み込みのデータ型で苦労してるし、clrは特にサードパーティーのライブラリが対応してなくて苦労してる。
ただ、ニュートラルにするとshenとかFantomみたいにあんまり他の言語と相互利用できなくなる。
clrは、unity使えるけどスマホで使えないし、WPF対応させたりしてるけどクロス環境では使えないみたいな話も。

JVMは末尾再帰辛いけどindyやgraalvm+truffleみたいにネタが増えてて実装オタク向けの新しい題材が増えてるし、他のVMでも.netよりもerlangのvmや、llvmあたりの方がまだ活発なイメージがある。
0460デフォルトの名無しさん
垢版 |
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が生まれたのだけど、順序間違ってない?
0461デフォルトの名無しさん
垢版 |
2016/08/25(木) 03:01:28.74ID:EcGIN1F9
フォローありがとう。
unity+clojureclrってiosで動くようになったのか。

javaの規格では末尾再帰最適化はないけど、
ibmのj9 vmでは、末尾再帰最適化してくれる。
0462デフォルトの名無しさん
垢版 |
2016/09/12(月) 17:44:10.20ID:qDbI1d2i
S式はいつまで日陰なのか
なんでXMLは普及したのか
XMLの前身のHTMLはなぜS式ではなかったのか
無茶苦茶汚くなるスクリプト埋め込みやCSSとかをなぜ苦労してまで使うのか
そんなにS式が嫌か
0463デフォルトの名無しさん
垢版 |
2016/09/12(月) 18:18:05.53ID:q3qEXh1t
手習いの推薦図書で興味を惹かれたんだけど
物まね鳥きちんと読むと、どうなるの?
Lispをやるのにどんなご利益があるの?
0464デフォルトの名無しさん
垢版 |
2016/10/08(土) 11:21:36.68ID:fiaM9vLl
>そんなにS式が嫌か
はい
0465デフォルトの名無しさん
垢版 |
2016/10/08(土) 12:09:44.18ID:1yrGmOsT
括弧の対応わかんなくてインデントで対処したら
だったらインデントあれば括弧いらなくね?ってなって
いまでは立派なHaskeller
0471はちみつ餃子 ◆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 を過ぎたからってそれで終わりってわけでもない。
所詮は一区切りの目安。
0472デフォルトの名無しさん
垢版 |
2016/10/13(木) 19:48:53.96ID:PkuNke6K
セマンティックバージョニングみたいなのがあるし、最近だと1.0を出さないのは個人で開発してるとおおいのかな?
昔はtexみたく収束していく系やってる人は多かったけど、やっぱり個人かね。
0473デフォルトの名無しさん
垢版 |
2016/10/14(金) 01:22:40.11ID:XWvLcjKQ
というかそのドット別に小数点じゃないし・・・
混同するのは間違いないのでいっそコロンやセミコロンで区切ったほうが理解しやすいかもしれない
0474デフォルトの名無しさん
垢版 |
2016/10/14(金) 10:16:22.13ID:vLfiDK4O
いや、本来は小数点だったよ
「0.9の次だけどまだ未完成だから0.10にしたよー」とかやらかしたから信用を失っただけで
0476デフォルトの名無しさん
垢版 |
2016/10/14(金) 19:07:47.56ID:zN4aic2C
社内業務ソフトですらバージョン番号が0.xなのってざらだと思うのだけどなぁ
1.0ってほぼこれで完璧的な意味で付ける会社もあるだろうし
(売り物のくせにVer 3の倍数から完璧の会社もあるけど:老舗のOS屋さんとか)
なお、1.0以降になるとちょっと仕様が変わっただけでメジャーバージョンが上がる会社もあるけど(猫科の動物の名前付ける所とか:Ver 9までクソだったような気もするけど)

ようするにバージョン番号って作者が自由に付ける物じゃないの?
0477はちみつ餃子 ◆8X2XSCHEME
垢版 |
2016/10/14(金) 19:53:07.72ID:njZqyYby
>>476
自由でいいけど、ひとつのソフトは一貫した (わかりやすい) ルールを持っておいてほしくはあるね。
0478デフォルトの名無しさん
垢版 |
2016/10/14(金) 21:35:46.95ID:5nO9NwFR
まあ linux もいきなり 3.x になったり,よく分からない理由で 4.x になったり
0481デフォルトの名無しさん
垢版 |
2016/10/15(土) 21:27:25.53ID:bOlsxR9R
0.x.yは劇的な変更があっても泣くなよ、という意味合いだと思っている

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

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

目安としてセマンティックバージョニングを導入するのは賛成だけど、厳密にしきれない部分はどうしてもあるわな。
そこらへんは柔軟に対処するしかしゃあねぇべ。
0493デフォルトの名無しさん
垢版 |
2017/01/25(水) 16:59:16.79ID:IDNrNCFj
>>492
命令セットの検討を優先したからとりあえず柔軟なS式ということにしただけで、
ずっとあれを使うつもりはないみたいだよ。
0494デフォルトの名無しさん
垢版 |
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 もライブラリの名前を除いてサポートできているとのこと。
0498SCHEME餃子 ◆8X2XSCHEME
垢版 |
2017/02/13(月) 20:41:00.93ID:B8yZNpnE
ある程度大きな単位でならバインディング作って投げてしまえばいいんだけど、
ちまちまやると境界を超える部分のオーバーヘッドで逆効果になったりするので、
本格的にやろうとすると処理系自体がサポートする必要はあると思う。
0499デフォルトの名無しさん
垢版 |
2017/02/17(金) 09:12:11.58ID:SQwgU5dB
Racketのプログラムを並列化して高速化したい。ハーランに書き直すのが1番手間かからずに高速化できるのだろうか
0501デフォルトの名無しさん
垢版 |
2017/03/04(土) 17:46:48.41ID:ASS1Dwl9
『scheme手習い』読み始めた
この本自体はめっちゃ面白いけど実際に自分のPCでschemeを走らせる方法が全く分からないのはどうすれば
0503デフォルトの名無しさん
垢版 |
2017/03/04(土) 18:14:56.86ID:ASS1Dwl9
>>502
ぐぐったらGaucheじゃないかってGoogleに怒られた
チュートリアルがないみたいだけど絶版の『プログラミングGauche』を買った方がいいの?
0505デフォルトの名無しさん
垢版 |
2017/03/05(日) 09:40:39.32ID:ZY1iiKPn
>>501
特にこだわりが無ければ、Racketが最も簡単なのでおすすめ。
ダウンロードしてインストールするだけでプログラミングに必要な環境が全て整うぞ。
0508SCHEME餃子 ◆8X2XSCHEME
垢版 |
2017/03/06(月) 19:02:32.45ID:4f//mV7K
個人的にはそろそろ R7RS (の処理系) を前提にしてもいいんじゃないかと思ってるが、
総合的な開発環境の便利さとしては Racket が優勝だわな。
少なくとも初心者にすすめられるものとしては。
0509デフォルトの名無しさん
垢版 |
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 にあるのは明らかだからね)
0510はつみつ餃子 ◆8X2XSCHEME
垢版 |
2017/03/07(火) 15:59:23.09ID:Jusdeq18
>>509
Large の状況については >>494 の通り。
全部の議論が終わるのはまだかなり先のことになるだろうし、
処理系の対応がどうなるかはまだなんとも言えないところはあるのは確かだと思う。
でも、 R7RS Small については R5RS を少し拡張するにとどまったからこそ、
その程度の小さな差を導入することをためらわなくていいんじゃないかという意図だった。

R5RS でも十分といえば十分なのかもしれないけど
特にライブラリなんかは結局のところ R5RS 処理系でもそれぞれの処理系ごとに機構を持ってたりするし、
SRFI を使ったりするときに統一的な書き方ができた方が教える方もやりやすいよ。
0512デフォルトの名無しさん
垢版 |
2017/03/27(月) 00:34:43.57ID:vvNcurYK
ここはスレチかもしれんがGo言語の勉強兼ねてR7RS片手にScheme処理系組んでみようとしてるけどトークナイザ書くの面倒すぎて心折れそう、お前らどうやってコード書くモチベ維持してるの?
0514デフォルトの名無しさん
垢版 |
2017/03/27(月) 12:19:08.00ID:wLrtvEW7
トークナイザなら特に変わらん
0515はつみつ餃子 ◆8X2XSCHEME
垢版 |
2017/03/27(月) 13:04:02.91ID:X8O8C+77
>>512
最初から完全である必要はないよ。
数値を整数だけにして文字列や識別子のエスケープも全部省略くらいのものから始めたらいいと思う。
限定的にでも動くものが目の前にあればモチベーションを維持しやすい。
0517デフォルトの名無しさん
垢版 |
2017/04/02(日) 12:22:30.38ID:aBxOBDdQ
通常のletのように使うだけでgensym済みのlet文を生成するマクロ用コードを作ったのですが、このような挙動をする関数名を教えてください。
(let ((foo (gensym))) `(let ((,foo ,x)) ...)

(my-let* ((foo x)) ...)
と書ける感じです。再発明でなく役立つのであればここにCC0で貼りたいです。
0520デフォルトの名無しさん
垢版 |
2017/04/02(日) 13:06:11.52ID:aBxOBDdQ
突然死しないうちにとりあえず貼りますね。
アカウントは消すのでいいものであればbase64で書き残します。
ttps://gist.github.com/lla/f9244aefb7eee18db4cd
0522デフォルトの名無しさん
垢版 |
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
0525デフォルトの名無しさん
垢版 |
2017/04/03(月) 21:45:51.66ID:hrRYx8PC
schemeでは衛生マクロを使うので不要だと思います。
commonlispでも仕様が中途半端なので不要だと思います。
そのまま書くのと手間が変わらないですし。
0526デフォルトの名無しさん
垢版 |
2017/04/04(火) 12:16:18.07ID:ugpuQ2R8
バカにマクロは無理だと何度
0527デフォルトの名無しさん
垢版 |
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名の変数は込み入った文や副作用でセットすることが多く、最初に全てのシンボルに値を入れられると不便ということでしょうか?
 ネストが一つ減る程度の関数は不要ですか?
0530デフォルトの名無しさん
垢版 |
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の再発明なんよ
0531デフォルトの名無しさん
垢版 |
2017/04/05(水) 11:30:15.85ID:must9X5J
and や orって短絡評価な気がして>>527はもやもやする
それと副作用のある式を同一式に並べるのは未定義だった気がする
0532デフォルトの名無しさん
垢版 |
2017/04/05(水) 11:40:21.51ID:0wF5qf+D
>>530
素敵です! ありがとうございます! これが探し求めていたものです。より良いものがあることを願っていました。
0534デフォルトの名無しさん
垢版 |
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))))
0535デフォルトの名無しさん
垢版 |
2017/04/05(水) 12:51:42.98ID:must9X5J
>a b cの順序は決まってなくて(a b c)の後にdが評価されるのだけは保証されている。で合ってるよね?
これ合ってないわ。評価されるからそれを見越して>>534の最後のように遅延評価を入れとくって話
もういいです。
0536デフォルトの名無しさん
垢版 |
2017/04/05(水) 12:59:10.45ID:must9X5J
評価されるから、じゃなくて評価の順序が決まってないから
それを見越して無引数lambdaを1つ挟む必要があるだった。
0537デフォルトの名無しさん
垢版 |
2017/04/05(水) 13:01:01.45ID:must9X5J
気持ち悪いからまとめると、
((a b c) d)のa b c dの評価順序は何も決まってないから気をつけてねって事。
0538デフォルトの名無しさん
垢版 |
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
って順番になる。
0539はつみつ餃子 ◆8X2XSCHEME
垢版 |
2017/04/05(水) 16:19:09.69ID:Paj3QjV7
最適化や諸々の都合で、同じ処理系でも順序が変わることはあるので、
単純な事例だけでは処理系の性質を推し量ることは出来ない。
0540デフォルトの名無しさん
垢版 |
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)
) ))
念願のものが作れました…。これで心残りはありません。
0542デフォルトの名無しさん
垢版 |
2017/04/06(木) 03:23:23.24ID:A4tBLGW+
>>533
> >>531
> 確か評価順が未定義なだけ。

少なくともSchemeではandやorでの式の評価順序は未定義でなくは左から順番に評価すると一意的に規定されているぞ
CLはどうだが知らんが
0544デフォルトの名無しさん
垢版 |
2017/04/06(木) 16:32:44.68ID:R/lK+iME
やっとリスト処理に慣れてgensymであーだこーだしてる人にsyntax-rulesは敷居高いと思う
0546デフォルトの名無しさん
垢版 |
2017/04/06(木) 18:46:00.39ID:b3KdhuXf
むしろSchemeから学ぶとマクロ入門にはsyntax-rulesしか書いてなくてdefine-macro&gensym触る機会が無かった
0549デフォルトの名無しさん
垢版 |
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.みたいになれちゃうよね)
0550デフォルトの名無しさん
垢版 |
2017/04/13(木) 16:37:53.95ID:UOOoC4Ge
syntax-rulesの動きがよくわからなくて理解できなかったけど古典的マクロなら単純で理解しやすかったな、準クォート使えば面倒でもなかったし(プログラムの腕はだめです)
0551デフォルトの名無しさん
垢版 |
2017/04/13(木) 21:50:42.52ID:KIw0CyXw
>>549 あくまでも構文の拡張のため
他のlispでもそうでしょ.具体的にそれ以外の他になにがある?
0552デフォルトの名無しさん
垢版 |
2017/04/14(金) 01:29:59.73ID:ktX2OX7O
>>551
他のLispに限らずマクロは構文の拡張と言えるほどの系統的な代物にはなってないでしょ
だからマクロを展開した途端にグローバルだったはずの変数が束縛されてローカルな変数に化けたりする(変数のキャプチャね)
つまり通常のマクロは(必要に応じて実行時と同じ計算も許して)ソーステキストという文字列データを処理しているだけ

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

ソースコードを文字データとして処理するのか句構造として処理するのかでは考え方も保証できる正しさや展開の安全性も全く違う
0553デフォルトの名無しさん
垢版 |
2017/04/14(金) 02:55:56.83ID:f5XItAeI
>>552
> lispマクロは構文の拡張と言えるほどの系統的な代物にはなってない.
そんなお前定義しらんし,そんならsyntax-rulesも違う.
はなしが無限退行しそうだからもういいわ.
0555デフォルトの名無しさん
垢版 |
2017/04/14(金) 07:39:01.84ID:a6xDhPFv
さあ、わかんなくなってきました。
とにかくsyntax-rulesの方が高級で、実装がめんどくさくて、低機能で、とりあえずほとんどの用はたりる。
0556デフォルトの名無しさん
垢版 |
2017/04/14(金) 20:02:05.16ID:E0l2Apap
そのめんどくさいの一点だけでLISP系にsyntax-を導入する価値は微妙
パターンマッチだからLISPじゃなくていいわけよね
syntax-rule/caseを日本語で詳細解説した本とかWebページってない?
■ このスレッドは過去ログ倉庫に格納されています

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