erlang: функция, вызываемая с реальным 'fun', должна быть преобразована с помощью parse_transform? - PullRequest
1 голос
/ 11 июля 2011

Я смотрю на книгу по программированию на O'Reilly Erlang, и есть пример, который запускается в оболочке erlang, который выглядит следующим образом:

17> MS = ets:fun2ms(fun({Name,Country,Job}) when Job /= cook ->
                   [Country,Name] end).
[  ....an erlang match expression is returned....  ]
18> ets:select(countries, MS).
[[ireland,sean],[ireland,chris]]

Однако, когда я делаю что-то подобное в своем коде(не в оболочке):

Fun = fun({Type,_,_,ObjectId,PlayerId}) when Type==player_atom, PlayerId==2 -> ObjectId end,
MatchFun = ets:fun2ms(Fun),
PlayerObjectId = ets:select(?roster_table, MatchFun),

Я получаю FUBAR:

exit:{badarg,{ets,fun2ms,[function,called,with,real,'fun',should,be,transformed,with,parse_transform,'or',called,with,a,'fun',generated,in,the,shell]}}

(Кроме того, мне интересно, почему ошибка не 'функция вызывается с ....«Вероятно, так: io: format (« ~ p », TheErrorMessage) будет переносить строки?)

В любом случае, я отказался от выбора в пользу ets: foldl, так как последний работает и - через исключения в забаве -позволяет мне прекратить обход, когда первый элемент найден.Но мне все еще интересно ...

... а?(Я немного читал в parse_transform, и я достаточно новичок, чтобы ошибиться, что мне не хватает соединения.)

1 Ответ

3 голосов
/ 12 июля 2011

Исключение badarg является признаком встроенной функции (или псевдофункции, как в данном случае), вызванной с неверным параметром. В этом случае функция ets:fun2ms/1.

Чтение из официальной документации :

fun2ms (LiteralFun) -> MatchSpec

Псевдо функция, которая с помощью parse_transform преобразует LiteralFun вводится как параметр в вызове функции для match_spec. Под «буквальным» подразумевается, что веселье должно быть написано как параметр функции, он не может храниться в переменной, которая в свою очередь передается функция ).

...