public
Description: Reia is a Ruby/Python-like language for BEAM, the Erlang VM
Homepage: http://reia-lang.org
Clone URL: git://github.com/tarcieri/reia.git
Fix Reia / Erlang interface to not clobber Reia types returned from Erlang 
functions
Tony Arcieri (author)
Tue Aug 05 01:14:17 -0700 2008
commit  bb384d0c1cb46c223ce32f59b981fa98264879ac
tree    7647979bfc7ac051b2695ec1ae5262d280d6dff4
parent  b1e84559f20e4e90133a760c168708946a84f7ff
...
40
41
42
43
 
44
45
46
...
40
41
42
 
43
44
45
46
0
@@ -40,7 +40,7 @@ read_until_blank(Input, Prompt) ->
0
 eval_print(String, Binding) ->
0
   case reia_parse:string(String) of
0
     {ok, Exprs} ->
0
- {value, Value, NewBinding} = reia_erl:r2e('ReiaEval':exprs(Exprs, Binding)),
0
+ {tuple, {value, Value, NewBinding}} = 'ReiaEval':exprs(Exprs, Binding),
0
       print(Value),
0
       NewBinding;
0
       
...
21
22
23
 
 
24
25
26
27
28
 
29
30
31
...
45
46
47
48
49
 
 
50
51
52
...
21
22
23
24
25
26
27
28
29
 
30
31
32
33
...
47
48
49
 
 
50
51
52
53
54
0
@@ -21,11 +21,13 @@ funcall(Receiver, to_internal, []) ->
0
   case Receiver of
0
     {dict, _} ->
0
       {tuple, Receiver};
0
+ {regexp, _} ->
0
+ {tuple, Receiver};
0
     _ ->
0
       reia_erl:e2r(Receiver)
0
   end;
0
 
0
-funcall(Receiver = {constant, Name}, Method, Arguments) ->
0
+funcall({constant, Name}, Method, Arguments) ->
0
   apply(Name, Method, Arguments);
0
 funcall(Receiver, Method, Arguments) when is_integer(Receiver) or is_float(Receiver) ->
0
   'Numeric':funcall(Receiver, Method, silly_list_hack(Arguments));
0
@@ -45,8 +47,8 @@ funcall(Receiver = {lambda, _}, Method, Arguments) ->
0
   'Lambda':funcall(Receiver, Method, silly_list_hack(Arguments));
0
 funcall(Receiver = {regexp, _}, Method, Arguments) ->
0
   'Regex':funcall(Receiver, Method, silly_list_hack(Arguments));
0
-funcall(_, _, _) ->
0
- throw({error, unknown_receiver}).
0
+funcall(Receiver, _, _) ->
0
+ throw({error, unknown_receiver, Receiver}).
0
   
0
 %%
0
 %% Funcalls that take blocks
...
34
35
36
37
38
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
39
40
41
42
...
34
35
36
 
 
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
0
@@ -34,8 +34,25 @@ rlist2elist([Term|Rest], Acc, Order) ->
0
 % Convert an Erlang term to a Reia term
0
 e2r(Term) when is_list(Term) ->
0
   {list, {[e2r(Element) || Element <- Term], normal}};
0
-e2r(Term) when is_tuple(Term) ->
0
- {tuple, list_to_tuple([e2r(Element) || Element <- tuple_to_list(Term)])};
0
+e2r(Term) when is_tuple(Term) ->
0
+ case Term of
0
+ {list, {List, Type}} when is_list(List) and is_atom(Type) ->
0
+ Term;
0
+ {tuple, Tuple} when is_tuple(Tuple) ->
0
+ Term;
0
+ {string, String} when is_binary(String) ->
0
+ Term;
0
+ {lambda, Lambda} when is_function(Lambda) ->
0
+ Term;
0
+ {dict, _} ->
0
+ Term;
0
+ {constant, _} ->
0
+ Term;
0
+ {regexp, _} ->
0
+ Term;
0
+ _ ->
0
+ {tuple, list_to_tuple([e2r(Element) || Element <- tuple_to_list(Term)])}
0
+ end;
0
 e2r(Term) when is_function(Term) ->
0
   {lambda, Term};
0
 e2r(Term) -> Term.
0
\ No newline at end of file
...
14
15
16
17
 
18
19
20
21
22
 
23
24
25
...
14
15
16
 
17
18
19
20
21
 
22
23
24
25
0
@@ -14,12 +14,12 @@ module Tuple
0
   # Tuple#[]
0
   # Retrieve an element from a Tuple
0
   def funcall(tuple, ~'[]', [index])
0
- erlang::element(index - 1, tuple)
0
+ erlang::element(index + 1, tuple)
0
   
0
   # Tuple#to_s
0
   # Generate a string representation of a Tuple
0
   def funcall(tuple, ~to_s, [])
0
- ["(", tuple.to_list().join(","), ")"].join()
0
+ ["(", tuple.to_list().map { |e| e.to_s() }.join(","), ")"].join()
0
     
0
   # Tuple#size
0
   # Return the number of elements in a Tuple

Comments

    No one has commented yet.