newLISP 組込関数の構文を表示してみる...または、簡易マニュアル?

 昨日の primitives で組込関数名が判ったら、次は構文を知りたくなるもの(笑)。
 ということで、マニュアルから構文を抜き出す関数を作ってみました。

(context 'MAIN:syntax)
(if-not manual (setq manual (read-file (string (env "NEWLISPDIR" ) "/newlisp_manual.html"))))
(define (syntax:syntax func (html manual))
  (if (primitive? func)
    (letn (fname ((parse (string func) "@") 0)
           pre (find (string {} fname) html)
           post (find "</h4>" html 1 pre)
           ;post (find "</p>" html 1 pre)
           res (replace {<[^>]+>} (pre (- post pre) html) "" 1))
        (replace "&nbsp;" res " ")
        (silent (print res)))
    "not primitive"
  ))
(context MAIN)

 マニュアルは newLISP のインストール・ディレクトリにあるものを参照しています。
 使い方は、こんな感じ。

> (syntax find-all)
find-all
syntax: (find-all str-regex-pattern str-text [exp [int-regex-option]])
syntax: (find-all list-match-pattern list-lists [exp])
syntax: (find-all exp-key list exp func-compare)

 関数名がわからない場合は、昨日の primitives をどうぞ(笑)。
 また、silent を使って戻り値(文字列)表示を抑制していますので、表示後 return キー入力が必要です。
 たいていは、これで十分ですが、

> (syntax >)

ERR: value expected in function find : pre
called from user defined function syntax
> 

 あらら、、、特殊文字は苦手のようです。
 何故?

> (syntax &)
&lt;, &gt;, =, &lt;=, &gt;=, !=
syntax: (&lt; exp-1 exp-2 [exp-3 ... ])

syntax: (&gt; exp-1 exp-2 [exp-3 ... ])
syntax: (= exp-1 exp-2 [exp-3 ... ])
syntax: (&lt;= exp-1 exp-2 [exp-3 ... ])

syntax: (&gt;= exp-1 exp-2 [exp-3 ... ])
syntax: (!= exp-1 exp-2 [exp-3 ... ])

 どうやら、HTML の特殊文字を考慮しなければならないようです。
 その結果、完成形はこうなりました。

(context 'MAIN:syntax)
(define (set-manual (text (read-file (string (env "NEWLISPDIR" ) "/newlisp_manual.html"))))
  (setq manual text))
(if-not manual (set-manual))
(define (syntax:syntax func flag (html manual))
  (if (primitive? func)
      (letn (tmp ((parse (string func) "@") 0)
             fname (or (lookup tmp
                        '(("-" "+") ("*" "+") ("/" "+") ("%" "+")
                          ("" "&lt;") ("=" "&lt;") ("=" "&lt;") ("!=" "&lt;")
                          (">>" "&lt;&lt;") ("<<" "<<")
                          ("&" "&")))
                       tmp)
             pre (find (string {} fname) html)
             post (find (if flag "</p>" "</h4>") html 1 pre)
             res (replace {<[^>]+>} (pre (- post pre) html) "" 1))
        (replace "&lt;" res "")
        (replace "&amp;" res "&")
        (replace "&nbsp;" res " ")
        (silent (print res)))
    "not primitive"
  ))
(context MAIN)

 これなら、

> (syntax &)
&
syntax: (& int-1 int-2 [int-3 ... ])

 特殊記号を使った演算子も表示されます。
 さて、オプションの flag は変数 post の検索文字 "</h4>""</p>" にします。
 そうすることで、

> (syntax struct true)
struct
syntax: (struct symbol [str-data-type ... ])

The struct function can be used to define aggregate data types for 
usage with the extended syntax of import,
pack and unpack. This allows importing
functions which take C-language struct data types or pointers to these
aggregate data types.

 関数の内容の冒頭部分も表示されます。
 参照マニュアルを

(syntax:set-manual (get-url "http://www.newlisp.org/newlisp_manual-jp.html"))

 で日本語マニュアルに設定すれば、(要UTF-8版newLISP)

> (syntax struct true)
struct
syntax: (struct symbol [str-data-type ... ])

関数 struct は、
import、pack、unpack
の拡張構文で使用するためのデータ型の集合体を定義するのに使えます。
これは、C 言語の 構造体 データ型やデータ型の集合体のポインタを
取る関数の導入を可能にします。
The struct function can be used to define aggregate data types for 
usage with the extended syntax of import,
pack and unpack. This allows importing
functions which take C-language struct data types or pointers to these
aggregate data types.

 こんな感じに日本語の内容も出てきます。この場合、UTF-8版newLISP が必要です。お間違えなく。
 
 これで、インタラクティブ環境の簡易マニュアル完成、、、なんてね(笑)。

 以上、如何でしょうか?

No comments yet

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。