Archive for the ‘primitives’ Tag

newLISP の組込関数を表示してみる...または、find-all の filter 的使い方

 newLISP の組込関数は 360個前後(OS によって若干違う)。
 よく使う関数名は自然と打ち込めますが、たまにしか使わない関数だと打ち間違えたりします。
 マニュアルを見れば良いのですが、関数名だけを知りたいならば、

> (filter (fn (x) (primitive? (eval x))) (symbols))
(! != $ % & * + ++ - -- / : < <<  >= >> NaN? ^ abs acos acosh add address amb 
 :(途中略)
 xml-type-tags zero? zerop | ~)
> 

 として探すこともできます。
 しかし、このままでは多すぎるので、更に絞り込む関数を作ってみました。

(define (primitives reg flag (predicate primitive?) (cnt MAIN))
  (let (func (filter (letex (_p predicate) (fn (x) ('_p (eval x)))) (symbols cnt)))
    (if-not reg
        func
      (let (pat (if flag reg (string "^" reg ".*")))
        (map sym (find-all pat (map string func) $it (fn (x y) (regex x y 1))))))
  ))

 使い方はこんな感じ、

> (primitives)
(! != $ % & * + ++ - -- / : < <<  >= >> NaN? ^ abs acos acosh add address amb 
 :(途中略)
 xfer-event xml-error xml-parse xml-type-tags zero? zerop | ~)
> (primitives "ap")
(append append-file apply)
> 

 引数に文字列を与えれば、その文字列から始まる組込関数を返します。
 文字列には、正規表現も使えます。

> (primitives ".*file.*" true)
(append-file copy-file delete-file file-info file? read-file rename-file write-file)
> (primitives {.+\?$} true)
(NaN? array? atom? context? directory? empty? file? float? global? inf? integer? 
 lambda? legal? list? macro? nil? null? number? primitive? protected? quote? string? 
 symbol? true? zero?)
> 

 これで、おおかた絞り込めるでしょう(嬉)。
 正規表現を使ったリストの絞り込みには、find-allregex を組み合わせて、filter のように使っています。この使い方はマニュアルにある方法です。
 関数primitives の中をを見れば分かる通り、primitive? も引数ですから、

> (primitives ".+" true lambda?)
($reader-event cadr car cdr consp evenp flat1 fourth gensym mapc maplist mappend 
 module oddp primitives read-integer read-string remove second third)
> (primitives ".+" true context?)
(*gensym* Class MAIN Tree cnt decf defun hayashi incf include labels macro map-mv 
 multi-let psetq reference-inversion rsetq type-of with-open-file)
> 

 こんな風にも使えます。lambda? で $reader-event が出てきているのは、私の場合 macro.lsp を使っているからです。

> $reader-event
(lambda (macro:expr) 
 (if (list? macro:expr) 
  (dolist (macro:pattern macro:macro-list) 
   (if (match macro:pattern macro:expr) 
    (setf macro:expr (eval macro:expr)) 
    (set-ref-all macro:pattern macro:expr (eval $it) match)))) macro:expr)
> 

 さて、もう一つのオプションはコンテキストの指定で、

> (symbols macro)
(macro:body macro:callp macro:delete macro:expr macro:macro macro:macro-list macro:pattern 
 macro:resume macro:rewrite macro:sname macro:suspend)
> (primitives ".+" true lambda? macro)
(macro:resume macro:rewrite macro:suspend)
> (primitives ".+" true macro? macro)
(macro:delete macro:macro)
> 

 こんな感じ。
 ここまでやると、primitives ではないような、、、(汗)

以上、如何でしょうか?

P.S.
 ちなみ、symbols では fnlambdalambda-macro は出て来ません。
 名無し(無名関数と無名マクロ)だからシンボルですら無い!
 たぶん、、、