評価


apply

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

seealso: funcall
seealso: multiple-value-call
[ Intro | 目次 | 索引 | 目的別 | 評価 ]

call-interactively

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/

seealso: command-execute
[ Intro | 目次 | 索引 | 目的別 | 評価 ]

command-execute

type: Function
arguments: command-execute COMMAND &optional HOOK
package: editor
file: builtin.l
エディタのコマンドを実行します。
 
  COMMAND  : 文字列の場合,COMMAND をキーボードマクロとして実行します。
             シンボルの場合,COMMAND を interactive に実行します。
  HOOK     : COMMANDがシンボルの場合のみ使われます。
             HOOK には,2引数関数を指定し,第1引数はシンボル名,
             第2引数にはプレフィックスアーギュメントがある場合は 
             (list *prefix-value*) が,ない時は nil が入ります。
             コマンドを実行後,HOOKが実行されます。
             これ以上の詳細は不明です。

使用例:
  ;;; (command-execute "^X^F")と書いてfind-fileを実行してみます。
  (command-execute "^X^F")
 
  ;;; interactiveなコマンドを実行してみます。
  (command-execute 'next-line)

  ;;; interactiveでないコマンドを実行してみます。
  (command-execute 'goto-bol)
  =>不正なコマンドです: goto-bol

  ;;; HOOKを使ってみます。 
  (command-execute 'next-line #'(lambda (x y) (msgbox "~w\n~w" x y)))

  ;;; 各自,C-j や C-u C-j で上記のコマンドを実行してみください。

seealso: call-interactively
seealso: interactive
seealso: execute-extended-command
seealso: call-last-kbd-macro
seealso: *prefix-args*
[ Intro | 目次 | 索引 | 目的別 | 評価 ]

eval

type: Function
arguments: eval FORM
package: lisp
file: builtin.l
FORM を評価します。

[ Intro | 目次 | 索引 | 目的別 | 評価 ]

eval-buffer

type: Function
arguments: eval-buffer BUFFER
package: editor
file: lispmode.l
バッファ全体を評価します。
eval-region を使って実装されています。

seealso: eval-region
[ Intro | 目次 | 索引 | 目的別 | 評価 ]

eval-expression

type: Function
arguments: eval-expression X
package: editor
file: cmds.l
lisp 式 X を評価します。[ESC ESC]
対話的に呼び出された場合はミニバッファで入力された式を評価します。

seealso: interactive
[ Intro | 目次 | 索引 | 目的別 | 評価 ]

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
[ Intro | 目次 | 索引 | 目的別 | 評価 ]

eval-when

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 で変わりました。

[ Intro | 目次 | 索引 | 目的別 | 評価 ]

execute-extended-command

type: Function
arguments: execute-extended-command COMMAND &optional RAW ARG
package: editor
file: misc.l
ミニバッファからコマンドを対話的に入力して実行します。[ESC x]

seealso: command-execute
seealso: repeat-complex-command
[ Intro | 目次 | 索引 | 目的別 | 評価 ]

funcall

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の式や
  シンボルを内部的に関数に変換します。従って、関数を表すシンボルでも関数
  そのものでも構いません。

seealso: apply
[ Intro | 目次 | 索引 | 目的別 | 評価 ]

interactive-p

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]

seealso: commandp
seealso: interactive
[ Intro | 目次 | 索引 | 目的別 | 評価 ]

load-file

type: Function
arguments: load-file FILENAME
package: lisp
file: misc.l
ファイルを対話的に読み込みます。
load-library と異なり、*load-path* にないファイルも読み込めます。

seealso: load-library
seealso: load
seealso: mc-load-file
[ Intro | 目次 | 索引 | 目的別 | 評価 ]

load-library

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
seealso: load-file
seealso: *load-path*
seealso: mc-load-library
seealso: 各種ロード関係の関数の違い
[ Intro | 目次 | 索引 | 目的別 | 評価 ]

mc-autoload

type: Function
arguments: mc-autoload FN FILE &optional COMMANDP MACROP ENCODING
package: lisp
file: misc.l
Shift_JIS 以外のエンコーディングのファイルに定義された関数を autoload するよう設定します。

  FN       : 関数シンボル
  FILE     : 関数が定義されたファイル名
  COMMANDP : interactive 関数かどうか
  MACROP   : マクロかどうか
  ENCODING : FILE を読み込む際のエンコーディング

seealso: autoload
seealso: mc-load-library
seealso: mc-load-file
[ Intro | 目次 | 索引 | 目的別 | 評価 ]

mc-load-file

type: Function
arguments: mc-load-file FILENAME &optional ENCODING
package: lisp
file: misc.l
Shift_JIS 以外のエンコーディングのファイルを読み込みます。
mc-load-library と違い、*load-path* にないファイルも読み込めます。
  
  FILENAME : ファイル名(フルパス)
  ENCODING : 読み込むファイルのエンコーディング

seealso: load-file
seealso: mc-autoload
seealso: mc-load-library
[ Intro | 目次 | 索引 | 目的別 | 評価 ]

mc-load-library

type: Function
arguments: mc-load-library FILENAME &key :encoding :no-suffix (:if-does-not-exist :error)
package: lisp
file: misc.l
Shift_JIS 以外のエンコーディングのファイルを読み込みます。

  FILENAME           : ファイル名
  :encoding          : 読み込むファイルのエンコーディング
  :no-suffix         : ファイルを *load-path* から探すかどうか指定します。
        t                ファイルを find-load-path で探します。
        nil              FILENAME をそのまま使います。
  :if-does-not-exist : ファイルが見つからなかった場合の挙動を指定します。
        :error           エラーを返します。デフォルトの挙動です。
        それ以外         nil を返します。

seealso: load-library
seealso: mc-autoload
seealso: mc-load-file
[ Intro | 目次 | 索引 | 目的別 | 評価 ]

provide

type: Function
arguments: provide MODULE-NAME
package: lisp
file: evalmacs.l
ある機能を持ったモジュールがロードされた事を示すためにファイルの先頭に書
いておく「おまじない」です。ここに書いたモジュール名が変数*modules*に登
録されます。

requireがモジュールのロードをする際にこの変数がチェックされてロード済だ
ったらもうロードしません。汎用的なモジュールを書く場合には使うようにしま
しょう。

互換性:
  Common Lispにはあり。
  muleにはなさそう。

使用例:
  ;;; lispmode.lより
  (provide "lispmode")

seealso: require
seealso: *modules*
[ Intro | 目次 | 索引 | 目的別 | 評価 ]

require

type: Function
arguments: require MODULE-NAME &optional PATHNAME
package: lisp
file: evalmacs.l
指定したモジュールを読み込みます。既に読込済みであれば何もしません。

互換性:
  Common Lispにはあり。
  muleにはなさそう。

使用例:
  (require "foreign")

seealso: load-library
seealso: provide
seealso: *modules*
seealso: 各種ロード関係の関数の違い
[ Intro | 目次 | 索引 | 目的別 | 評価 ]

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 ならロード中のメッセージを出さない。

seealso: *load-path*
seealso: load-library
[ Intro | 目次 | 索引 | 目的別 | 評価 ]