Archive for the ‘command-event’ Tag
command-event で load を楽に
以前、newLISP 組込関数の構文オンライン表示で使った command-event。
今回は、これを使って、ファイル名だけで lsp ファイルをロードします。
(command-event (fn (s)
(let (x (read-expr s))
(let (f (string x))
(when (and (starts-with f "'") (ends-with f ".lsp"))
(print "load ")
(if (file? (1 f)) (load (1 f)) (println (1 f) "\nERR: no file")))))))
末尾が “.lsp” の時、その lsp ファイルをロードします。
ただし、ファイル名の先頭には、クォート(’)をつけます。
使い方は、
C:\Language\newlisp>newlisp -n newLISP v.10.7.0 32-bit on Windows IPv4/6 UTF-8 libffi, options: newlisp -h > (command-event (fn (s) (let (x (read-expr s)) (let (f (string x)) (when (and (starts-with f "'") (ends-with f ".lsp")) (print "load ") (if (file? (1 f)) (load (1 f)) (println (1 f) "\nERR: no file"))))))) $command-event > $command-event (lambda (s) (let (x (read-expr s)) (let (f (string x)) (when (and (starts-with f "'") (ends-with f ".lsp")) (print "load ") (if (file? (1 f)) (load (1 f)) (println (1 f) "\nERR: no file")))))) > jdate nil > jdate.lsp nil > jdate nil > 'jdate.lsp load jdate.lsp > jdate jdate > (jdate) "2016/9/28 20:59:45 水" >
こんな感じ。もちろん、フルパスも使えます。
jdate については、こちらでどうぞ。
以上、如何でしょうか?
newLISP 組込関数の構文表示3...または、command-event の覚え書き
前回の組込 command-event を使ったインタラクティブ環境のコマンドヘルプを改良しました。
前回 command-event に使った関数では、文字列から、改行文字を取り除くのに、replaceを使っていました。Windows版では、CR と LF が、Java 上でのインタラクティブ環境(例えば、newLISP-GS のコマンドライン)では、LF が付加されているからです。V10.4.1からは Windows版で改行文字がつかなくなりますが、、、Java 上はそのままのようです。おそらく、Java 環境の仕様でしょう。
しかし、だからといって、今回は、わざわざreplaceを使う必要もなく、eval-stringを使う必要もなかったのです。
それは、read-exprを使うというもの。
最終的なスクリプトの command-event 部分はこうなりました。
(command-event
(fn (s)
(let (x (read-expr s))
(if (and (symbol? x)(find x syntax:lst))(syntax x)))))
こんな感じで、すっきり。これなら、オーバーヘッドも気にならない(笑)。
全スクリプトcommand-help.lsp はこちらからどうぞ。
以上、如何でしょうか?
newLISP 組込関数の構文表示2...または、command-event を使って見る
昨日の組込関数構文表示は如何でしょうか?
関数primitives と syntax を作ったのは、こちらのフォーラムの投稿を見たからです。
この問題は、以前から話題になっていて、すでに解決案が多数提案されてます。
とくに、こちらで紹介されている関数は、正規表現だけでエレガントに構文を取り出しています。
わざわざ作るまでもない?
そうとも言えますが、私が使うには、ちょっと足りない点があったからです。
一つは、関数primitives のように組込関数を表示する仕組みが無いこと。と言っても、探せば、あるかもしれません、、、(汗)
もう一つは、
> (syntax reverse) reverse ! syntax: (reverse list) syntax: (reverse string) > (syntax char) char utf8 syntax: (char str [int-index]) syntax: (char int)
こんな風に、破壊的関数や文字列単位操作の関数を表示をさせたかったこと。
それに、関数内容の一部も表示できるようにしたかったし、、、
まっ、正規表現の使い方が下手で、手続き処理的な関数を書いた結果とも言えますが(笑)。
ついで、マニュアルを日本語版にも簡単に変更できるようにしたのです、、、言い訳ですが。
さて、今回は、組込command-event を使って、インタラクティブ環境で使いやすくします。
内容は、組込関数を直接打ち込むと、構文を表示するというものです。
こんな感じ。
> push push ! utf8 syntax: (push exp list [int-index-1 [int-index-2 ... ]]) syntax: (push exp list [list-indexes]) syntax: (push str-1 str-2 [int-index]) >
どうでしょう。わざわざ関数syntax を呼び出す必要がありません。
さて、組込command-event を使う前に、syntax を少しばかり改良します。
(context 'MAIN:syntax)
(setq lst (MAIN:primitives)) ; 2012/4/3 added.
(define (set-manual (text (read-file (string (env "NEWLISPDIR" ) "/newlisp_manual.html"))))
(setq manual text))
(if-not manual (set-manual))
(define (set-flag flag)
(setq ex-flag flag))
(set-flag nil)
(define (syntax:syntax func (flag ex-flag) (html manual))
(if (primitive? func)
(letn (tmp ((parse (string func) "@") 0)
fname (or (lookup tmp
'(("-" "+") ("*" "+") ("/" "+") ("%" "+")
("<" "<") (">" "<") ("=" "<") ("<=" "<") (">=" "<") ("!=" "<")
(">>" "<<") ("<<" "<<")
("&" "&")))
tmp)
pre (find (string {} fname) html)
post (find (if flag "</p>" "</h4>") html 1 pre)
res (replace {<[^>]+>} (pre (- post pre) html) "" 1))
(replace "<" res "<")
(replace ">" res ">")
(replace "&" res "&")
(replace "—" res "-")
(replace " " res " ")
(println res) "")
"not primitive"
))
(context MAIN)
変更内容は、関数内容表示用flag の設定関数を用意したのと、関数syntax の出力から silent を外して、戻り値を "" に変更したことです。これならコマンドラインに出てきても、悪さをしませんからね。(2012/4/3 syntax:lst を追加。関数primitives はこちらあります。)
組込command-event の設定はこうなります。
(command-event
(fn (s)
(let (x (replace {\n|\r} s "" 0))
(if (find (sym x) syntax:lst)
(syntax (eval-string x))))))
(2012/4/3 判定方法と評価時期を変更。)
こうすれば、先ほどの例のように
> char char utf8 syntax: (char str [int-index]) syntax: (char int) > (syntax:set-flag true) true > char char utf8 syntax: (char str [int-index]) syntax: (char int) Given a string argument, extracts the character at int-index from str, returning either the ASCII value of that character or the Unicode value on UTF-8 enabled versions of newLISP. If int-index is omitted, 0 (zero) is assumed. The empty string returns nil. Both (char 0) and (char nil) will return "00". > (char 65) "A" >
こんな感じ。
以上、如何でしょうか?