An example how to do dynamic dispatch in Egel. This is a cool language.
# Just a showcase how one could do dynamic dispatch in Egel over a table.
#
# This is of course an extremely slow implementation over a lookup table
# represented as a list. But moving the combinators to C++ would help.
import "prelude.eg"
using System
using List
namespace Dispatch (
val dispatch_table = ref {}
def dispatch_register =
[ TAG FUNC ->
let TABLE = get_ref dispatch_table in
let TABLE = cons (TAG FUNC) TABLE in
set_ref dispatch_table TABLE ]
def dispatch_findrec =
[ TAG nil -> throw (format "dispatch for {} failed" TAG)
| TAG0 (cons (TAG1 FUNC) TABLE) ->
if TAG0 == TAG1 then FUNC [ _ -> dispatch_findrec TAG0 TABLE ]
else dispatch_findrec TAG0 TABLE ]
def dispatch_on =
[ TAG -> let TABLE = get_ref dispatch_table in
dispatch_findrec TAG TABLE ]
)
def ++ = Dispatch:dispatch_on "++"
val plus_float_register =
let FUNC =
[ K EXPR0 EXPR1 -> if [ E::float -> true | E -> false ] EXPR0 then (+) EXPR0 EXPR1 else K nop EXPR0 EXPR1
| K -> K nop ]
in
Dispatch:dispatch_register "++" FUNC
val plus_text_register =
let FUNC =
[ K EXPR0 EXPR1 -> if [ E::text -> true | E -> false ] EXPR0 then (+) EXPR0 EXPR1 else K nop EXPR0 EXPR1
| K -> K nop ]
in
Dispatch:dispatch_register "++" FUNC
def main =
print (1.0 ++ 2.0) "\n";
print ("hello " ++ "world") "\n";
print (1 ++ "failure")
No comments:
Post a Comment