評価
Type: Function
Arguments: apply FUNCTION ARG &rest MORE-ARGS
Package: lisp
File: builtin.l
引数を格納したリストを指定して関数を表すシンボルから関数を呼び出します。
FNには関数を表すシンボルでも関数でも構いません。引数の個数が必ず定まって
いる場合には、applyを使う必要は無くfuncallの方が良いと思います。
使用例:
;;; carをいろいろな呼び出し方でする。
(car '(a b c)) => a
(apply 'car '((a b c))) => a
(apply #'car '((a b c))) => a
Type: Function
Arguments: call-interactively COMMAND &optional HOOK
Package: editor
File: misc.l
指定された関数をinteractiveに呼び出したかのごとく実行します。
COMMAND : interactiveに呼び出す関数を指定します。
(interactive ...)として宣言された関数でなければなりません。
使用例:
;;; find-fileを無引数で呼び出してもエラーになる。
(find-file)
=> 引数が少なすぎます: (find-file)
;;; interactiveに呼び出すと大丈夫
(call-interactively 'find-file)
=> Find file: C:/applications/xyzzy/
Type: Function
Arguments: command-execute COMMAND &optional HOOK
Package: editor
File: builtin.l
エディタのコマンドを実行します。HOOKは何でしょうか?
使用例:
;;; (command-execute "^X^F")と書いてfind-fileを実行してみる。
(command-execute "^X^F")
Type: Function
Arguments: eval FORM
Package: lisp
File: builtin.l
FORM を評価します。
Type: Function
Arguments: eval-buffer BUFFER
Package: editor
File: lispmode.l
バッファ全体を評価します。
eval-region を使って実装されています。
SeeAlso: eval-region
Type: Function
Arguments: eval-region FROM TO &optional STREAM
Package: editor
File: lispmode.l
リージョン内に書かれたLispコードを評価します。
使用例:
(eval-region from to (selected-buffer))
SeeAlso: eval-buffer
Type: Special Form
Arguments: eval-when ({SITUATION}*) {FORM}*
Package: lisp
File: builtin.l
ひとことで言うと、フォームをいつ評価するかってことです。
今回の例だと、define-dll-entry などのマクロはコンパイル時に展開
されなければならないのですが、define-dll-entry は foreign で定
義されているので、foreign がロードされていないとマクロであるこ
とが認識できません。(eval-when ...) がなく、単に (require
"foreign") だけだと、コンパイル時には単なる関数コールだとみなさ
れてしまうため、マクロが展開されなくなってしまいます。そのため
に、eval-when でコンパイルするときも foreign をロードしろと指定
しているわけです。
ソース ソース(左と同一)
↓ (eval) ↓ (compile)
Lispインタープリタ Lispコンパイラ
↓
*.lc
↓ (load)
Lispインタープリタ
C言語だと maxというのがマクロですよね。
#define max(a,b) ((a>b)?a:b)
こんなん。
int foo(int x, int y)
{
return max(x, y);
}
と書いたら、
int foo(int x, int y)
{
return ((x> y) ? x : y);
}
こう書いたのと等価ですよね。
Cの入門書だとプリプロセッサがいったん展開してから、コンパイル
すると書かれていると思います。
lispだとこんなんになるんですが
---- test.l ---------
(defmacro macro-max (a b)
`(if (> ,a ,b) ,a ,b))
(defun foo (x y)
(macro-max x y))
------------------------
M-x byte-compile-fileってやったときに、
(defmacro macro-maxっていう文は、コンパイルするんでなくって
eval(インタープリタが評価する)しとかないといけない。
でないとfooのところで、コンパイル前にソースを展開できない。
だから eval-when (compile)なんです。
よくわからなかったら、3つ全部つけておけば大丈夫という説もある^^;
(eval-when (:compile-toplevel :load-toplevel :execute)
Common Lispの仕様書では、たしか eval, load, compile
だけ,だったと思います。
eval --- インタープリタにロードするときeval
compile --- compile時にeval
load --- compileした*.lc をロードするときeval
(eval-when (:compile-toplevel :load-toplevel :execute)
って、今まで、xyzzyオリジナルかと思ってました。
でもallegloのhelpをみていたら、
(eval-when (:compile-toplevel :load-toplevel :execute)
ってありますね。^^;
知りませんでした。
| Common Lispの仕様書では、たしか eval, load, compile
| だけ,だったと思います。
CLtL1 ではそうだったんですが、CLtL2 で変わりました。
Type: Function
Arguments: funcall FN &rest ARGUMENTS
Package: lisp
File: builtin.l
引数を指定して関数を表すシンボルから関数を呼び出します。
FNには関数を表すシンボルでも関数でも構いません。引数の個数が静的に定まら
ない場合にはfuncallは向いていないので、その場合にはapplyを使います。
使用例:
;;; carをいろいろな呼び出し方でする。
(car '(a b c)) => a
(funcall 'car '(a b c)) => a
(funcall #'car '(a b c)) => a
注意:
funcallやapply等の様に関数を引数とする標準の関数は、carがlambdaの式や
シンボルを内部的に関数に変換します。従って、関数を表すシンボルでも関数
そのものでも構いません。
Type: Function
Arguments: interactive-p
Package: editor
File: builtin.l
実行中の関数がinteractiveに呼ばれていればt、そうでなければnilを返します。
使用例:
;;; fooとbarという関数を定義して、fooをinteractiveに呼び出してみる。
;;; fooはinteractive扱いされているが、barはそうでない。
(defun foo () (interactive) (msgbox "foo: ~A" (interactive-p)) (bar))
=> foo
(defun bar () (interactive) (msgbox "bar: ~A" (interactive-p)))
=> bar
M-x: foo
=> [foo: t]
[bar: nil]
Type: Function
Arguments: load-library FILENAME &rest REST
Package: lisp
File: misc.l
ライブラリを対話的に読み込みます。
requireと異なり、一度読んでいてももう一度読み込みます。
内部的には、si:*load-libraryをinteractiveで宣言したものです。
| また、si:*load-library中で失敗したら、メッセージ等を出力して、処理を続けると
| いうのは可能でしょうか?
(handler-case
(si:*load-library "foo")
(error (c) (si:*print-condition c)))
(si:*load-library "bar")
SeeAlso: si:*load-library
Type: Function
Arguments: *load-library FILENAME &key :no-suffix :if-does-not-exist :no-message
Package: system
File: builtin.l
ライブラリをロードします。普通はload-libraryでいいと思いますが、
どんなときにsi:*load-libraryを使うのでしょうか?
:no-suffix : non-nil なら指定されたファイル名をそのままロードする。
nil なら *load-path* を考慮する。
:if-does-not-exist : :no-suffix が nil でファイルが存在しない場合、
:error ならエラー、それ以外なら nil を返す。
:no-message : non-nil ならロード中のメッセージを出さない。