[erlang-questions] Weird function match semantics

Matthew Dempsky matthew@REDACTED
Sun Nov 18 08:14:07 CET 2007


On 17 Nov 2007 10:48:14 +0100, Bjorn Gustavsson <bjorn@REDACTED> wrote:
> It does seems to be a bug in the evaluator. It works fine in
> compiled code. If time permits we will fix it in R12B-0.

The problem I discerned is that $X parses to {char,_,88}, while
erl_eval only expects lists to have integers; this evaluates fine:

    (fun([88] ++ _) -> ok end)("X")

The patch below fixes this for me, and generalizes handling of ++ in
match operations in general.

--- lib/stdlib/src/erl_eval.erl.orig    2007-11-17 23:08:50.000000000 -0800
+++ lib/stdlib/src/erl_eval.erl 2007-11-17 23:09:42.000000000 -0800
@@ -980,8 +980,8 @@
     throw(nomatch);
 match1({op,_,'++',{nil,_},R}, Term, Bs, BBs) ->
     match1(R, Term, Bs, BBs);
-match1({op,_,'++',{cons,Li,{integer,L2,I},T},R}, Term, Bs, BBs) ->
-    match1({cons,Li,{integer,L2,I},{op,Li,'++',T,R}}, Term, Bs, BBs);
+match1({op,_,'++',{cons,Li,H,T},R}, Term, Bs, BBs) ->
+    match1({cons,Li,H,{op,Li,'++',T,R}}, Term, Bs, BBs);
 match1({op,_,'++',{string,Li,L},R}, Term, Bs, BBs) ->
     match1(string_to_conses(L, Li, R), Term, Bs, BBs);
 match1({op,Line,Op,A}, Term, Bs, BBs) ->



More information about the erlang-questions mailing list