Gauche:WishList:pending

Gauche:WishList:pending

Gauche:WishList に出たもののうち、直接は採用しなかったもの。 できるだけ代案を提示しています。


ssax:xml->sxml で実体参照の変換

齊藤 (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 と同じでかまわないので、あらためて書くのも面倒な感じです。

eval内で、macroやspecial formの実体を、macroやspecial formとして扱ってほしい

Gauche:#<syntax>や#<macro>の評価 にて検討中。 実装は簡単だけれど、一貫性のある仕様にするのが難しい。

useとprovide

useする時は、 (use hoge.fuga) なのに、provideする部分では、 (provide "hoge/fuga")なのは、ちょっと分かりにくいです…‥。 -- nekoie (2004/04/07 10:25:24 PDT)

gauche.collectionにappend-mapとfilterあたりも

コレクションで扱っていると上記二つについては 欲しい場面に頻繁に遭遇したんで要望だけだしときます。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をデフォルトでジェネリックにすることで性能が大幅に低下するのは 嫌なので、この変更はジェネリック関数の最適化とセットになります。


use に複数引数やワイルドカードを

既出でしたら、すみません。

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されると。

エラーメッセージのclosureがlambdaを指し示す場合は、その出現順番を示して欲しい

*** 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)

みたいに。

失敗したテストの行番号を表示

(2006/05/14 01:29:10 PDT): gauche.testのtest*が失敗したとき、test-endが出力するエラーレポートの各行に、ファイル名と行番号を出力すると便利じゃないでしょうか。同じようなテストがたくさん並んでいるときに、失敗したテストを見つけるのが手間なので。

変換ポートの CES を知りたい

leque(2006/09/13 22:26:58 PDT):

(format oport "<?xml version=\"1.0\" encoding=\"~A\"?>" (or (port-ces oport) 'utf-8))

のように使える手続きが欲しいです。

with-sigmask

(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オブジェクトの表示

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 に属するかどうかテストできると 便利だと思います。

リストリテラル および ベクターリテラル

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}    ;; ベクタリテラル

ううむ。

unbound variableはコンパイル時に

変数名を間違えたとき、定義していない関数や変数を使ってしまったとき、その部分が評価されるまでエラーが出ませんが、コンパイル時に出るように出来ませんでしょうか。

scheme的には後でトップレベル変数として束縛される可能性を無くしてしまいたくないということなのかも知れませんが。

時間のかかる処理の最後で、unboundって見つかるとがっかりしすぎで。

もし既にある機能だったら、すみません。(その際はこのエントリー消します)

今でもなんらかの工夫で同じようなことが出来るとかの情報でも。 宜しく御願いします(katsujiro)

gauche.netをwin9x系でも使えるように

win9x系では_open_osfhandleが常に-1を返してしまいます。そのせいでソケットに入出力ができません。(ソケットの作成自体には成功しているようです。)ソケットまわりについてはまだ整備中のようですので可能であればこの点も考慮して頂ければ助かります。 (2005/11/24 20:55:56 PST)

環境変数のキー一覧を取得する手段があれば嬉しい(かも)

defined?

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? はそのフォームがコンパイルされた時のモジュールを 基準に変数名を参照するので注意して下さい。

Literate comment

プログラムソーステキストの指定部分だけをコードと看倣す記法があるとうれしいなぁ。 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相当 のものを呼んじゃっているので。

More ...