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 を使って見る

 昨日の組込関数構文表示は如何でしょうか?
 関数primitivessyntax を作ったのは、こちらのフォーラムの投稿を見たからです。
 この問題は、以前から話題になっていて、すでに解決案が多数提案されてます。
 とくに、こちらで紹介されている関数は、正規表現だけでエレガントに構文を取り出しています
 わざわざ作るまでもない?
 そうとも言えますが、私が使うには、ちょっと足りない点があったからです。
 一つは、関数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
                        '(("-" "+") ("*" "+") ("/" "+") ("%" "+")
                          ("<" "&lt;") (">" "&lt;") ("=" "&lt;") ("<=" "&lt;") (">=" "&lt;") ("!=" "&lt;")
                          (">>" "&lt;&lt;") ("<<" "&lt;&lt;")
                          ("&" "&amp;")))
                       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 "&gt;" res ">")
        (replace "&amp;" res "&")
        (replace "&mdash;" res "-")
        (replace "&nbsp;" 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"
> 

 こんな感じ。

 以上、如何でしょうか?