`
liumengfan
  • 浏览: 32949 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用erlang的动态执行编写DSL

阅读更多
今天看到Erlang 动态执行erlang动态解释
实验的代码如下:
-module(dsl).

-compile([export_all]).

broker() ->
     receive
       {buy, Quantity, Ticker} ->
          % 向外部系统下单的具体代码放在这里
          %
          Msg = "Order placed: buying ~p shares of ~p~n",
          io:format(Msg, [Quantity, Ticker]),
          broker();
       {sell, Quantity, Ticker} ->
          % 向外部系统下单的具体代码放在这里
          %
          Msg = "Order placed: selling ~p shares of ~p~n",
          io:format(Msg, [Quantity, Ticker]),
          broker()
     end.

load_biz_rules(Pid, File) ->
     {ok, Bin} = file:read_file(File),
     Rules = string:tokens(erlang:binary_to_list(Bin), "\n"),
     [rule_to_function(Pid, Rule) || Rule <- Rules].

rule_to_function(Pid, Rule) ->
     {ok, Scanned, _} = erl_scan:string(Rule),
     [{_,_,Action},{_,_,Quantity},_,_|Tail] = Scanned,
     [{_,_,Ticker},_,_,_,{_,_,Operator},_,{_,_,Limit}] = Tail,
     to_function(Pid, Action, Quantity, Ticker, Operator, Limit).

to_function(Pid, Action, Quantity, Ticker, Operator, Limit) ->
     fun(Ticker_, Price) ->
        if
          Ticker =:= Ticker_ andalso
          ( ( Price < Limit andalso Operator =:= less ) orelse 
            ( Price > Limit andalso Operator =:= greater ) ) ->
              Pid ! {Action, Quantity, Ticker}; % place an order 
          true ->
              erlang:display("no rule applied")
        end
     end.

apply_biz_rules(Functions, MarketData) ->
        lists:map(fun({Ticker,Price}) ->
                lists:map(fun(Function) ->
                                 Function(Ticker, Price)
                           end, Functions)
                 end, MarketData),
	ok.

用到的biz_rules.txt内容如下:
引用

buy 9000 shares of GOOG when price is less than 500
sell 400 shares of MSFT when price is greater than 30
buy 7000 shares of AAPL when price is less than 160

执行的结果如下:
[root@dev-emp-com work]# erl
Erlang R14B (erts-5.8.1) [source] [64-bit] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.8.1  (abort with ^G)
1> Pid = spawn(fun() -> dsl:broker() end). 
<0.34.0>
2> 
2> Functions = dsl:load_biz_rules(Pid, "biz_rules.txt").
[#Fun<dsl.0.70661670>,#Fun<dsl.0.70661670>,
 #Fun<dsl.0.70661670>]
3> MarketData = [{'GOOG', 498}, {'MSFT', 30}, {'AAPL', 158}].
[{'GOOG',498},{'MSFT',30},{'AAPL',158}]
4> dsl:apply_biz_rules(Functions, MarketData).
"no rule applied"
"no rule applied"
"no rule applied"
"no rule applied"
"no rule applied"
"no rule applied"
"no rule applied"
Order placed: buying 9000 shares of 'GOOG'
ok
Order placed: buying 7000 shares of 'AAPL'
5> 
分享到:
评论

相关推荐

    并发需求下的Scala及Erlang语言的比较与使用

    在高并发需求的场景下,如金融市场的实时数据分析、人工智能算法的并行执行等,Scala和Erlang都能提供卓越的性能。例如,对于金融市场的实时数据处理,每秒计算上百万个指标,同时支持上万用户的实时长连接,这些...

    Programming Elixir 1.6 课程源代码

    - **元编程**:Elixir支持在运行时修改和创建代码,提供了便利的宏(Macros)系统,使得编写DSL(领域特定语言)变得容易。 - **类型系统**:Elixir是动态类型语言,但可以使用类型注解提供代码的静态检查,提高...

    Elixir 元编程

    **Elixir元编程详解** ...通过使用宏和其他元编程工具,你可以创建自定义的 DSL(领域特定语言),实现模块生成,甚至改变Elixir的标准行为。然而,务必记住,明智地使用元编程,才能真正发挥其优势。

    elasticsearch-7.17.3

    Gradle是一个基于Apache Ant和Maven概念的项目自动化构建工具,它使用一种领域特定语言(DSL)来声明项目设置,可以使用Java、Groovy或Kotlin编写。在Elasticsearch的开发过程中,Gradle可能被用来编译源代码、运行...

    ErlangElixirFestHandsOn

    这对于创建DSL(领域特定语言)或者简化复杂任务的编写非常有用。 6. ** OTP(Open Telecom Platform)**: - OTP是Erlang的一套库和设计原则,包含了一系列的库模块和工具,用于构建可扩展、容错的应用程序。...

    高级语言的分类.txt

    高级语言是相对于低级语言(如机器语言和汇编语言)而言的,它们提供了更抽象、更易于理解和使用的语法结构,使得程序员能够更高效地编写代码。本文将深入探讨高级语言的分类,以及不同类型的高级语言在实际应用中的...

    elixir_dojo_mx:在墨西哥城的Elixir Dojo进行的练习的资料库

    1. 模式匹配和函数定义:学习如何使用模式匹配来解构数据结构并编写条件逻辑。 2. OTP(Open Telecom Platform)基础:了解Erlang的OTP库,它是Elixir系统设计的基础,包含诸如GenServer、GenEvent和Agent等行为。 3...

    programming_elixiir:プログラミングElixir(第2版)https

    这使得编写代码生成器或者自定义DSL(领域特定语言)变得容易,例如Phoenix框架就利用元编程简化了Web应用开发。 3. **模式匹配** Elixir的模式匹配是其语法的一大亮点,它可以在函数定义中进行数据解构,帮助简化...

    算盘:解析并评估Elixir中的数学表达式。 受到math.js的启发

    4. **领域特定语言(DSL)支持**:DSL允许编写更加直观和简洁的代码来表示数学表达式。在Elixir中,可能通过元编程实现DSL,使用户可以更自然地写出数学表达式,提高代码的可读性和易用性。 5. **错误处理**:考虑...

    elixir_school:Elixir学校基础https://elixirschool.comen

    这种能力在编写编译器、构建DSL(领域特定语言)或进行代码自动生成时非常有用。Elixir的宏系统是实现这一功能的关键,它使得代码在编译阶段就能进行计算。 Elixir是建立在BEAM虚拟机上的,这是Erlang的虚拟机,为...

    作品:可插拔​​业务逻辑组件的框架

    综合这些信息,我们可以推断这个框架可能是一个使用Elixir编写的,支持DSL和铁路导向编程的系统,它允许开发者通过可插拔的组件来构建和管理业务逻辑。框架的核心特性可能包括方便的数据处理流水线、明确的错误处理...

    pepabo.ex:Elixir勉强会演习问题解答例

    Elixir是一种基于Erlang VM(BEAM)的函数式编程语言,设计用于构建可扩展和高并发的系统。在“pepabo.ex:Elixir勉强会演习问题解答例”中,我们可以期待看到一系列针对Elixir语言特性和实践的练习及其解答。 1. **...

Global site tag (gtag.js) - Google Analytics