dsl de faire un double post à la fois sur le groupe rails et sur ruby,
mais il semble plus avoir grand monde chez ruby.fr
j’essaye de faire une méthode pour convertir une expression infix et
prefix
ca passe pas
Ou est mon problème ?
merci
def parse_simple(expr, opers=%w(+ - * /))
return expr if opers.empty?
return parse_simple(expr, opers[1…-1]) unless expr.include?
(opers.first)
“(#{opers.first} " +
expr.split(opers.first).map {|e|
p e
parse_simple(e, opers[1…-1]).strip
}.join(” ") +
“)”
end
def parse(expr, exprs = [])
while expr.gsub!(/(([^()]+))/) {“expr:#{(exprs <<
parse_simple($1)).size - 1}”}; end
expr = parse_simple(expr)
while expr.gsub!(/expr:(\d+)/) {exprs[$1.to_i]}; end
expr
end
Je ne vois pas de différence fondamentale entre (+ (* 2 5) 1) et (+ 1 (*
2 5)), le “+” est commutatif aux dernières nouvelles (ce qui n’est
certes pas le cas du “-” ou du “/”).
Intuitivement : tu as un bloc “25" à traiter d’abord, puis ce bloc est
inclus dans un bloc “résultat + 1”. Pourquoi dans un cas ça te
retournerait " 2 5” et dans l’autre “+ 1 résultat”. Je veux dire,
pourquoi les opérandes trouveraient leur ordre inversé dans un des
traitements et pas dans l’autre ? Et quel intérêt cela aurait ? Peux-tu
préciser un peu le problème ?
Au passage cette conversation me fait penser à un compilateur (ça sert
pas Ã
ça entre autre ?). Une suite d’articles (en cours) explique comment
faire un
compilateur en Ruby : Writing a compiler in Ruby, bottom up