10

I have a big list of global variables that each have their own setup function. My goal is to go through this list, call each item's setup function, and generate some stats on the data loaded in the matching variable. However, what I'm trying now isn't working and I need help to make my program call the setup functions.

The global variables and their setup functions are case-sensitive since this came from XML and is necessary for uniqueness.

The data looks something like this:

'(ABCD ABC\d AB\c\d ...)

and the setup functions look like this:

(defun setup_ABCD...  
(defun setup_ABC\d...

I've tried concatenating them together and turning the resulting string into a function, but this interferes with the namespace of the previously loaded setup function. Here's how I tried to implement that:

(make-symbol (concatenate 'string "setup_" (symbol-name(first '(abc\d)))))

But using funcall on this doesn't work. How can I get a callable function from this?

4

3 に答える 3

12

It's because MAKE-SYMBOL returns an uninterned symbol. You should use INTERN instead.

于 2008-11-17T02:58:52.783 に答える
0

INTERN を使用するか、(おそらく、100% 役立つことを確認するためにプロファイリングする必要があります) 文字列の連結と最初の検索を実行し、結果をハッシュテーブルにキャッシュするヘルパー関数を使用します (元のシンボルをキーオフします)。 )。これは、純粋な INTERN/CONCATENATE ソリューションよりも高速である可能性があり、生成される一時的なガベージが少なくなる可能性がありますが、より長期的なストレージを使用することになる可能性があります。

次のようなもの:

(defvar *symbol-function-map* (make-hash-table))

(defun 検索記号 (記号)
  (または (gethash シンボル *symbol-function-map*)
      (let ((関数名 (intern (concatenate 'string "setup_" (シンボル名 symbol)))))
        (setf (gethash シンボル *シンボル関数マップ*) (シンボル関数 関数名)))))

関数自体ではなく関数の名前が必要な場合は、SYMBOL-FUNCTION の呼び出しを省略します。

于 2008-11-17T12:35:51.870 に答える
0
(funcall (read-from-string (concatenate 'string "setup_" (symbol-name(first '(abc\d))))))  

も動作します。

于 2011-07-22T14:48:06.103 に答える