有没有一种方法可以在Erlang中拥有一个完整的解释器,而不仅仅是一个“shell”。由于它是一种动态语言,不能在解释器中定义命名函数有点令人失望。我怀疑这是因为编译单元(模块)必须显式编译才能由VM执行,但可能存在一个充当动态/可重新编译模块的REPL?
5lwkijsr1#
简短的回答是NO,它确实适合Erlang处理代码的方式。Erlang VM仅支持编译代码。包括编译在内的代码处理单元是模块,可以加载、删除、更新和清除模块。因此,不可能像在lisp中那样混合解释和编译函数。可以扩展shell以允许在其中定义解释函数,但这些函数只能从shell解释器中调用,而不能从其他模块中调用。也可以使shell重新编译并重新加载“shell模块”,以便可以从其他模块调用其中的函数。但是这个模块实际上只存在于对erlang的调用中。老实说,我真的不明白这一点,因为重新编译和重新加载代码总是那么快,这不是一个问题。与其说是出于方便,不如说是出于习惯。
gkn4icbw2#
这与Defining erlang functions in the shell有关简短回答:
更长的答案:
bq3bfh9z3#
1> F = fun () -> io:format("Hello World~n", []) end. #Fun<erl_eval.43.3316493> 2> F(). Hello World ok 3>
创建一个名为F的匿名函数,然后应用它。1
F
3条答案
按热度按时间5lwkijsr1#
简短的回答是NO,它确实适合Erlang处理代码的方式。
Erlang VM仅支持编译代码。包括编译在内的代码处理单元是模块,可以加载、删除、更新和清除模块。因此,不可能像在lisp中那样混合解释和编译函数。可以扩展shell以允许在其中定义解释函数,但这些函数只能从shell解释器中调用,而不能从其他模块中调用。也可以使shell重新编译并重新加载“shell模块”,以便可以从其他模块调用其中的函数。但是这个模块实际上只存在于对erlang的调用中。
老实说,我真的不明白这一点,因为重新编译和重新加载代码总是那么快,这不是一个问题。与其说是出于方便,不如说是出于习惯。
gkn4icbw2#
这与Defining erlang functions in the shell有关
简短回答:
更长的答案:
bq3bfh9z3#
创建一个名为
F
的匿名函数,然后应用它。1