Gauche:WishList に出たもののうち、直接は採用しなかったもの。 できるだけ代案を提示しています。
齊藤 (2009/04/11 21:50:45 PDT) : ssax:xml->sxml では gt 等の xml において最低限の実体参照しか理解しません。 xhtml を解釈させようとすると nbsp 等を理解できずエラーになってしまいます。 オプショナルな引数で実体参照の情報を受取ってくれるようになっていると便利かと思いました。
ssax:make-parser の DOCTYPE ハンドラでやればいいのですが…
(define (parser xml-port)
((ssax:make-parser
DOCTYPE (lambda(port docname systemid internal-subset? seed)
(if internal-subset? (ssax:skip-internal-dtd port))
(values #f '((nbsp . " ") (copy . "(c)")) '() seed))
) xml-port '()))
他のハンドラが省略できないらしくエラーになってしまいます。 NEW-LEVEL-SEED, FINISH-ELEMENT, CHAR-DATA-HANDLER は ssax:xml->sxml と同じでかまわないので、あらためて書くのも面倒な感じです。
(define xhtml-entity
'((nbsp . "\u00a0")
(copy . "\u00a9")))
(use sxml.ssax)
(with-module sxml.ssax
(set! ssax:predefined-parsed-entities
`(,@(with-module user xhtml-entity)
,@ssax:predefined-parsed-entities)))
(call-with-input-string "<xml>©</xml>"
(cut ssax:xml->sxml <> '()))
→Gauche:#<syntax>や#<macro>の評価 にて検討中。 実装は簡単だけれど、一貫性のある仕様にするのが難しい。
useする時は、 (use hoge.fuga) なのに、provideする部分では、 (provide "hoge/fuga")なのは、ちょっと分かりにくいです…‥。 -- nekoie (2004/04/07 10:25:24 PDT)
(define-syntax provide-module
(syntax-rules ()
((_ module) (provide (module-name->path (quote module))))))
コレクションで扱っていると上記二つについては 欲しい場面に頻繁に遭遇したんで要望だけだしときます。cut-sea:2007/09/15 03:15:50 PDT
Shiro(2007/09/15 03:38:37 PDT): 0.9以降(もしかすると1.0以降)に、 srfi-1とgauche.collection, gauche.sequenceあたりの大幅な見直しを考えています。
例えば fold や filter はデフォルトでジェネリックで、型特定の速い実装が 使いたければ list-fold/string-fold とか list-filter/string-filterみたいな 専用関数を使えると。
mapやfoldをデフォルトでジェネリックにすることで性能が大幅に低下するのは 嫌なので、この変更はジェネリック関数の最適化とセットになります。
既出でしたら、すみません。
gaucheの便利な機能は拡張モジュールに有ることが多く、useは良く書くのですが、どう書く.orgなんかだと、少ないコードで書きたくなって、useの列挙が気になります。
とりあえず、useには、複数モジュールをかけるようにして下さると、助かります。
プロトタイピング程度では(use gauche.*)とかしてみたりもしたいのですが、いかがなもんでしょうか。あらかじめ、ワイルドカードを使われること前提で機能や名前の衝突のないモジュールを作らなければいけないのは、辛いとは思いますが。
自分の作ったモジュール群をまとめてロードしたい場合には、ワイルドカードが使えると大変助かります。(use usermod.*)みたいな感じで。
Shiro(2007/08/31 02:02:17 PDT): 「フォルダに入れるとuseされる」という、 いわばプラグイン機能みたいな感じのものは、言語処理系レベルよりは 上のレイヤ (フレームワークとかアプリケーション) でやるべきかなあと 思います。例えばこんなマクロをmyframeworkモジュールで定義しといて:
(define-macro (load-plugins) `(begin ,@(library-fold 'plugins.* (lambda (mod path r) (cons `(use ,mod) r)) '())))
アプリケーションコードでこんなふうにすれば:
(use myframework) (load-plugins)
plugins/ ディレクトリに放りこんであるモジュールがだーっとuseされると。
*** ERROR: wrong number of arguments for #<closure (main #f)> (required 2, got 1)
というエラーメッセージがありますが、#fではなくて、手続き内でのlambdaの出現順番を表示してもらえればデバッグが助かります。
*** ERROR: wrong number of arguments for #<closure (main &3)> (required 2, got 1)
みたいに。
(f a (lambda (x y) #;;appnd (append x y)))ってな感じで。エラー時にこれ"も"表示してもらえれば、再現性のあるエラーなら、怪しいところにラベルをつけて特定するのに役立ちます。まあ、local defineすればエラー時に名前が出てくるので、そうして対処しているわけですが。
(f a (rec (appnd x y) (append x y)))
(2006/05/14 01:29:10 PDT): gauche.testのtest*が失敗したとき、test-endが出力するエラーレポートの各行に、ファイル名と行番号を出力すると便利じゃないでしょうか。同じようなテストがたくさん並んでいるときに、失敗したテストを見つけるのが手間なので。
leque(2006/09/13 22:26:58 PDT):
(format oport "<?xml version=\"1.0\" encoding=\"~A\"?>" (or (port-ces oport) 'utf-8))
のように使える手続きが欲しいです。
び(2006/05/26 02:20:22 PDT): 特定のブロック内だけシグナルマスクを変更する関数が欲しいです。
(define (with-sigmask how mask thunk)
(let1 old_sigset #f
(dynamic-wind
(lambda () (set! old_sigset (sys-sigmask how mask)))
thunk
(lambda () (sys-sigmask SIG_SETMASK old_sigset)))))
こんな感じでしょうか。
charsetオブジェクトの表示があまり見やすくありません。たとえば#[@A-Z]は#[@-Z]と表示されてしまい、この文字集合に含まれる文字が何か分かりにくいです(この程度の例ではたいしたことありませんが、もっと要素の多い文字集合では確認に手間がかかります)。入力したときの形か、あるいはアルファベットと数字以外は範囲指定しない形で表示するようになると使いやすいです。(2004/10/17 19:12:20 PDT)
Rui (2006/06/02 20:35:18 PDT):「サンク」という用語、Gaucheのマニュアルに説明なしに現れているようです。第1章か初出の箇所のどちらかに説明があれば親切だと思います。私は「アリティ」という用語がわからなかったのでこれもついででお願いします。
2006/05/31 07:29:28 PDT: gauche.test で、エラーが起こるかどうかだけでなく、 起こったエラーが期待した condition に属するかどうかテストできると 便利だと思います。
(test* "msg" <expected-condition>
(with-error-handler (lambda (e) (class-of e))
(lambda ()
(proc arg))))
(test* "msg" <expected-condition>
(guard (e (else (class-of e)))
(proc arg)))
(test* "msg" (test-error <expected-condition>)
(proc arg))
nobsun(2006/09/21 22:27:53 PDT)
cut-seaさんと話しててでてきた思いつき.
`(,x ,y ,z)
を
[x y z]
とか
`#(,p ,q ,r)
を
#[p q r]
のように簡単に書けるといいかも.でも [,] は (,) と同じになっちゃって るから,{,} かなぁ.
{x y z} ;; リストリテラル
#{x y z} ;; ベクタリテラル
ううむ。
(let ((x 0) (y 1)) '#(x y)) => #(x y) ;; リテラル (let ((x 0) (y 1)) (vector x y)) => #(0 1) ;; コンストラクタ欲しいのは後者ですよね?
変数名を間違えたとき、定義していない関数や変数を使ってしまったとき、その部分が評価されるまでエラーが出ませんが、コンパイル時に出るように出来ませんでしょうか。
scheme的には後でトップレベル変数として束縛される可能性を無くしてしまいたくないということなのかも知れませんが。
時間のかかる処理の最後で、unboundって見つかるとがっかりしすぎで。
もし既にある機能だったら、すみません。(その際はこのエントリー消します)
今でもなんらかの工夫で同じようなことが出来るとかの情報でも。 宜しく御願いします(katsujiro)
win9x系では_open_osfhandleが常に-1を返してしまいます。そのせいでソケットに入出力ができません。(ソケットの作成自体には成功しているようです。)ソケットまわりについてはまだ整備中のようですので可能であればこの点も考慮して頂ければ助かります。 (2005/11/24 20:55:56 PST)
(use gauche.process)
(call-with-input-process '("/usr/bin/env") port->string-list)
全環境変数を得るportableな方法って、プロセスのmain関数でenvpを
受け取る以外にありましたっけ。
Shiro (2002/12/01 04:57:22 PST): symbol-bound? というのがあります。 あれ、ドキュメントに書いてないな。
gosh> (symbol-bound? 'foo) #f gosh> (define foo 3) foo gosh> (symbol-bound? 'foo) #t
symbol-bound? はそのフォームがコンパイルされた時のモジュールを 基準に変数名を参照するので注意して下さい。
プログラムソーステキストの指定部分だけをコードと看倣す記法があるとうれしいなぁ。 Haskell では、\begin{code}と\end{code}の間もしくは、> ではじまる行のみをコードと 看倣す記法があります。これに相当するものが Gauche にあるととても嬉しいです。Haskell では Literate comment を使用しているかどうかは、明示的にコンパイラやインタープリタに指示するか、ソースファイルの拡張子で判定するようになっています。(.hs は普通のソースファイル .lhs は Literate comment を使用したソースファイル) --nobsun 2002/11/25 01:13:17 PST
Shiro (2002/11/25 02:46:55 PST): 2パスになっちゃいますが、こんなんはどうですか。
(define (load-with-literate-comment file)
(call-with-input-string
(with-output-to-string
(lambda ()
(with-input-from-file file
(lambda ()
(define (code line)
(cond ((eof-object? line))
((#/^\\end\{code\}/ line) (comment (read-line)))
(else (print line) (code (read-line)))))
(define (comment line)
(cond ((eof-object? line))
((#/^\\begin\{code\}/ line) (code (read-line)))
((#/^>/ line)
=> (lambda (m)
(print (m 'after)) (comment (read-line))))
(else (comment (read-line)))))
(comment (read-line))))))
load-from-port))
対話レベルで拡張子によって動作を変えるには、loadを再定義するという 裏技が:
(use srfi-13)
(define load
(let ((old-load load))
(lambda (file . args)
(if (string-suffix? ".lscm" file)
(load-with-literate-comment file)
(apply old-load file args)))))
但しこれだけだと、コマンドラインからliterate comment入りのファイルを スクリプトとして読ませることはできません。内部で直接load-from-port相当 のものを呼んじゃっているので。