首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获取Erlang本地乐趣的AST (抽象语法树)?

如何获取Erlang本地乐趣的AST (抽象语法树)?
EN

Stack Overflow用户
提问于 2018-04-01 06:41:21
回答 2查看 640关注 0票数 2

对于一些Erlang术语,例如atomtuplelist,我可以使用erl_parse:abstract/1获得AST。但它不适用于fun%s。

代码语言:javascript
复制
~ $ erl
Erlang/OTP 19 [erts-8.0] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V8.0  (abort with ^G)

1> erl_parse:abstract(foo).
{atom,0,foo}

2> erl_parse:abstract([bar]).
{cons,0,{atom,0,bar},{nil,0}}

3> erl_parse:abstract({baz}).
{tuple,0,[{atom,0,baz}]}

4> erlang:fun_info(fun() -> ok end, type).
{type,local} % So this is a local fun

5> erl_parse:abstract(fun() -> ok end).       
** exception error: no function clause matching 
                    erl_parse:abstract(#Fun<erl_eval.20.52032458>,0,
                                       #Fun<erl_parse.3.3133389>) (erl_parse.yrl, line 1330)

我知道一些本地的fun在他们的信息中有他们的AST。但这并不适用于所有本地fun

代码语言:javascript
复制
~ $ erl
Erlang/OTP 19 [erts-8.0] [source] [64-bit] [smp:4:4] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V8.0  (abort with ^G)

1> erlang:fun_info(fun() -> ok end, env).
{env,[{[],
       {eval,#Fun<shell.21.31625193>},
       {value,#Fun<shell.5.31625193>},
       [{clause,1,[],[],[{atom,1,ok}]}]}]} %% Here

2> foo:test(). %% Yields a fun
#Fun<foo.0.10202683>

3> erlang:fun_info(foo:test(), type).
{type,local} %% So this is a local fun too

4> erlang:fun_info(foo:test(), env). 
{env,[]} %% : (

获取外部fun的AST并不难。我的解决方案是加载它的模块光束块,并获得该函数的AST。如果你有更好的解决方案,请告诉我。主要的问题是如何获得局部fun的AST。

EN

回答 2

Stack Overflow用户

发布于 2019-10-05 22:48:57

也许你也可以尝试结合使用erl_scan:string/1erl_parse:parse_exprs/1,例如:

代码语言:javascript
复制
1> Fun = "fun() -> ok end.".
"fun() -> ok end."
2> {ok, Tokens, _EndLocation} = erl_scan:string(Fun).
{ok,[{'fun',1},
     {'(',1},
     {')',1},
     {'->',1},
     {atom,1,ok},
     {'end',1},
     {dot,1}],
    1}
3> {ok, ExprList} = erl_parse:parse_exprs(Tokens).
{ok,[{'fun',1,{clauses,[{clause,1,[],[],[{atom,1,ok}]}]}}]}

希望这会对你有所帮助。

票数 2
EN

Stack Overflow用户

发布于 2019-01-31 03:18:27

erl_parse:抽象/1无法接受函数对象作为参数。我认为你在其他方面都是对的。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49593120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档