Skip to content

Instantly share code, notes, and snippets.

@abp
Forked from ckirkendall/clojure-match.clj
Created June 16, 2012 21:37
Show Gist options
  • Save abp/2942560 to your computer and use it in GitHub Desktop.
Save abp/2942560 to your computer and use it in GitHub Desktop.
Language Compare F#, Ocaml, Scala, Clojure and Haskell
(use '[clojure.core.match :only [match]])
(defn evaluate [env exp]
(match [exp]
[(['Number a] :seq)] a
[(['Add x y] :seq)] (+ (evaluate env x) (evaluate env y))
[(['Multiply x y] :seq)] (* (evaluate env x) (evaluate env y))
[(['Variable i] :seq)] (env i)))
(def environment {"a" 3, "b" 4, "c" 5})
(def expression-tree '(Add (Variable "a") (Multiply (Number 2) (Variable "b"))))
(def result (evaluate environment expression-tree))
(defprotocol Expression
(evaluate [e env] ))
(deftype Number1 [x])
(deftype Add [x y] )
(deftype Multiply [x y])
(deftype Variable [x])
(extend-protocol Expression
Number1 (evaluate [e env] (.x e ) )
Add (evaluate [e env] (+ (evaluate (.x e) env) (evaluate (.y e) env)))
Multiply (evaluate [e env] (* (evaluate (.x e) env) (evaluate (.y e) env)))
Variable (evaluate [e env] (env (.x e))))
(def environment {"a" 3, "b" 4, "c" 5})
(def expression-tree (Add. (Variable. "a") (Multiply. (Number1. 2) (Variable. "b"))))
(def result (evaluate expression-tree environment))
//Here's some F# code...
type Expression =
| Number of int
| Add of Expression * Expression
| Multiply of Expression * Expression
| Variable of string
let rec Evaluate (env:Map<string,int>) exp =
match exp with
| Number n -> n
| Add (x, y) -> Evaluate env x + Evaluate env y
| Multiply (x, y) -> Evaluate env x * Evaluate env y
| Variable id -> env.[id]
let environment = Map.ofList [ "a", 1 ;
"b", 2 ;
"c", 3 ]
// Create an expression tree that represents
// the expression: a + 2 * b.
let expressionTree1 = Add(Variable "a", Multiply(Number 2, Variable "b"))
// Evaluate the expression a + 2 * b, given the
// table of values for the variables.
let result = Evaluate environment expressionTree1
import Data.Map
data Expression =
Number Int
| Add Expression Expression
| Multiply Expression Expression
| Variable String
evaluate :: Map String Int -> Expression -> Int
evaluate env (Number x) = x
evaluate env (Add x y) = evaluate env x + evaluate env y
evaluate env (Multiply x y) = evaluate env x * evaluate env y
evaluate env (Variable x) = findWithDefault 0 x env
environment = fromList([("a",3), ("b",4), ("c",7)])
expressionTree = Add (Variable "a") (Multiply (Number 2) (Variable "b"))
result = evaluate environment expressionTree
type expression =
Number of int
| Add of expression * expression
| Multiply of expression * expression
| Variable of string
let rec evaluate (env: string->int) exp =
match exp with
Number n -> n
| Add (x, y) -> evaluate env x + evaluate env y
| Multiply (x, y) -> evaluate env x * evaluate env y
| Variable id -> env id
let environment (str: string) : 'a = match str with "a" -> 3 | "b" -> 4 | "c" -> 5
let expressiontree1 = Add(Variable "a", Multiply(Number 2, Variable "b"))
let result = evaluate environment expressiontree1
abstract class Expression
case class Number(i: Int) extends Expression
case class Add(x: Expression, y: Expression) extends Expression
case class Multiply(x: Expression, y: Expression) extends Expression
case class Variable(id: Symbol) extends Expression
object Maths extends App {
val environment = Map('a -> 1,
'b -> 2,
'c -> 3)
def evaluate(env: Map[Symbol, Int], exp: Expression): Int = exp match {
case Number(n: Int) => n
case Add(x, y) => evaluate(env, x) + evaluate(env, y)
case Multiply(x, y) => evaluate(env, x) * evaluate(env, y)
case Variable(id: Symbol) => env(id)
}
val expressionTree1 = Add(Variable('a), Multiply(Number(2), Variable('b)))
println(evaluate(environment, expressionTree1))
}
import java.util.*;
public class Eval {
public static Expression Number(final int x) {
Expression exp = new Expression() {
public int evaluate(Map env) {
return x;
}
};
return exp;
}
public static Expression Multiply(final Expression x, final Expression y) {
Expression exp = new Expression() {
public int evaluate(Map env) {
return x.evaluate(env) * y.evaluate(env);
}
};
return exp;
}
public static Expression Add(final Expression x, final Expression y) {
Expression exp = new Expression() {
public int evaluate(Map env) {
return x.evaluate(env) + y.evaluate(env);
}
};
return exp;
}
public static Expression Variable(final String var) {
Expression exp = new Expression() {
public int evaluate(Map env) {
return (Integer)env.get(var);
}
};
return exp;
}
public static void main(String[] args){
Map env=new HashMap();
env.put("a", 3);
env.put("b", 4);
env.put("c", 5);
Expression expressionTree=Add(Variable("a"), Multiply(Number(2), Variable("b")));
int result=expressionTree.evaluate(env);
System.out.println(result);
}
}
abstract class Expression {
public abstract int evaluate(Map env);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment