#cons* の*の用法って良く使われるんですか? take*の*とは意味が違うわけですよね。どちらがメジャーな*なんでしょう?
#doted-listを積極的に使ったときに,どうやって区別してるのかなあ・・・・と。
#WiLiKi のどこかに命名規則の話があったような…
#* は「ちょっと違うバージョン」くらいの意味で使う感じで、あまり具体的な意味を表さないですよ。
##典型的な用法としていくつかのカテゴリに分類は出来ますが、他の記号よりはかなり意味が広いみたいです。
#最近、竹内先生が作っていた、TAO/SILENT 言語仕様書を眺めてたんですが、命名規約の説明で
#「-* 主にちょっとした変種を作るのに用いられる.
変種の変種たることを説明的に名前の中に入れるのが面倒なときに使われる.」
#とあって、確かにそういうところもあるかなあと思ったりしました。
#なるほど。ありがとうございます。となると,オレオレルールでdotted-listを表すしかないようですね・・・・・
#というのも,dotted-listのfoldもできるよなーと。
#そういうのは traverse とか walk いった語をくっつけた名前を使うことがありますね。
#英語に明るくないので妥当なニュアンスの単語が何かというのは私にはうまく選べないんですが。
#map*があるからfoldr*,foldl*にしたらいいのかしらんと思ってたら,*にはあまり意味がないということになるので,dotted-listを表す何かがあるのかとばかり・・・・
#それらしい接頭辞、それこそ dotted- を頭につけるのでも不自然ではない命名だと私は思いますよ。
#scheme 的には improper かな。
#ところで er-macro が導入されて思ったんですが、 er の意味づけだと identifier? にシンボルを渡したときも #t になる方が自然というか、他の処理系ではそうしている場合も多いみたいですが、 Gauche 的には別物扱いでいくのかな。
#erは確かにすべてをrenamingで説明可能にしているので、identifierという概念を一切入れずに、全部symbolでごりごりやることもできるようにはなっていますね。実はGaucheでもidentifierをsymbolの特殊なサブタイプにしてしまおうかというアイディアは持っています。でも一方で、identifierとsymbolが完全に別の型になっている方がマクロシステムとしてはすっきりする感じもあるので迷ってます。
#今までトップレベル define で束縛しようとする識別子は unwrap-syntax されて生の状態で束縛されるようになっていたのが、他の束縛識別子と同様にリネームされるようになった、ということでいいんでしょうか?それと新たな疑問が出てきまして、
#gosh> (define-module foo
(use gauche.record)
(export foo)
(define-syntax foo
(syntax-rules ()
((_)
(define-record-type <foo>
(make-foo)
foo?
(x))))))
#<undef>
gosh> (import foo)
#<undef>
gosh> (foo)
|#<identifier foo#<foo>.1e17320>-#<identifier foo#x.1e172c0>-set!|
gosh> |#<identifier foo#<foo>.1e17320>-#<identifier foo#x.1e172c0>-set!|
#<closure ((%rtd-mutator <record-meta> <top>) #f)>
#あ、これは単純に名前がバグってるだけなのかな。
#ああそうか、新たな名前を作るときに渡されるのがidentifierである可能性を考慮してませんね。
#この場合この <foo>-x-set! は <foo> も x も syntax-rules で挿入された識別子なので、そこから作られる <foo>-x-set! も同様にリネームされてしまって、他所から普通には参照できない識別子になるんでしょうか。部分的にリネームされた識別子が混じっている場合も同じでしょうか。どういう挙動が望ましいのでしょう。
#ふむう。これは少々複雑な問題かもしれぬ。define-record-typeが作り出して挿入するトップレベル識別子はもともとunhygienicなんだけど、その挿入先はdefine-record-typeを呼び出している文脈になるはずだな。このコード例の場合、それはfooのマクロ展開時ということで、一貫性を持たせるなら<foo>と同じルールで挿入された識別子がすべてリネームされることになりそう (つまり他から参照できない)。
#そうすると define-record-type が持つ新しい名前を作る機能が(<foo> や x をマクロ使用側から与えない限り)実質的に無力化されてしまうんでしょうか。なんか切ないですね。
#うーん、そもそも<foo>を呼び出し側から与えないという用途があまり推奨されないんじゃないでしょうか。複数回、別々のモジュールから呼び出された場合にどうすべきか、とか。
#Gaucheの現在の実装はバグってるので直すとして、<foo>を呼び出し側から与えてやれば、残りの生成される識別子は<foo>と同じ文脈に挿入される、とすればすっきりすると思います。xはトップレベル束縛に直接使われないので、リネームされてるのはおかしいですね。
#うーん、なるほど。複数回、或は別々のモジュールで呼び出された場合はそれぞれユニークな識別子になりユニークなレコード型になるんだと思いました。
#(モジュールとは関係なく、define-record-typeを同じ型名で複数回呼び出した場合、毎回新たな型が作られるんですが、それは置いておくとして)もし上のfooマクロで毎回ユニークな識別子が作られるとして、そのユニークな識別子をどうやって外から参照したらいいでしょうか。(マクロ展開の中にレコードを使うコードもすべて含めてしまえばいいですが、その場合は現在のように外から見えない識別子になっても問題ないですよね)
#そもそもこれってモジュール関係なくR6RS/R7RS的には見えないですよね?
#(import (scheme base))
(define-syntax foo
(syntax-rules ()
((_)
(define-record-type foo
(make-foo)
foo?
(x)))))
(foo)
(make-foo) ;; error
#この場合、make-fooがリネームされるかトップレベルにそのまま挿入されるかは処理系依存じゃなかったでしたっけ。違う?
#それはやっぱりマクロ展開の中にそのレコードを使うコードも全て含めますよね。あれ、何が問題なんでしたっけ( ꒪⌓꒪)
#これこそトップレベルの扱いがR5RSから変わったってやつですか?
#R6RS的には見えないはずです。R7RSはちょっと自信がないですが・・・
#R5RSだとトップレベルではあらゆる識別子が束縛されている処理系がアリでそれだとそのまま挿入されるけど、R7RSだとそれがなくなったので処理系によらずリネームされるみたいなことでしょうか。あんまりよく分かってないんですが。
#ちょっとどっちとも取れそうですが、リネームすると読めそうな。
#Identifiers that appear in the template but are not pattern
variables or the identifier hellipsisi are inserted into the output
as literal identifiers. If a literal identifier is inserted as a
free identifier then it refers to the binding of that identifier
within whose scope the instance of syntax-rules appears.
If a literal identifier is inserted as a bound identifier then
it is in effect renamed to prevent inadvertent captures of
free identifiers.