К сожалению, record_info на самом деле не является функцией, даже если она выглядит так.
Вы можете проверить это, протестировав следующее. Создать файл:
-module(something).
-record(a, {}).
Запустите оболочку Erlang:
> rr(something).
[a]
> record_info(fields, a).
[]
> A = a.
> record_info(fields, A).
* 2: illegal record info
Поэтому я рекомендую использовать макрос или специализированную функцию для записи record_info.
Чтобы ответить на ваш оригинальный вопрос. Используйте что-то вроде:
tables() ->
[?TABLE_MACRO(tablename),
?TABLE_MACRO(tablename2),
...].
где TABLE_MACRO - это что-то вроде:
-define(TABLE_MACRO(Table), fun() ->
mnesia:create_table(Table, [{disc_copies, Nodes},
{attributes, record_info(fields, Table)}])
end).
и затем используйте функцию, подобную приведенной ниже.
[case CreateTable of
{aborted, {already_exists, _}} -> ok;
{atomic, ok} -> ok
end || CreateTable <- tables()].
Тьфу! Можно почистить немного, но, надеюсь, вы понимаете общую идею.
- Макрос вместо использования переменной.
- Совпадают как с {atomic, ok}, так и {прервано, {ready_exists, _TableName}}