Med dette F# forslag til en “generisk” regnemaskine, vinder Allan Hvam Petersen endnu en låge.
#light
open System
open Microsoft.FSharp.Text.Lexing
open MrFrost10
Console.Write "Input: "
let line = Console.ReadLine()
let lexbuf = Lexing.from_string line
let e = Parser.start Lexer.token lexbuf
let rec factorial = function
| 0 -> 1
| n -> n * factorial(n - 1)
let rec eval = function
Plus(e1, e2) -> eval e1 + eval e2
| Minus(e1, e2) -> eval e1 - eval e2
| Times(e1, e2) -> eval e1 * eval e2
| Divide(e1, e2) -> eval e1 / eval e2
| Modulo(e1, e2) -> eval e1 % eval e2
| Sin e -> Math.Sin (eval e)
| Cos e -> Math.Cos (eval e)
| Tan e -> Math.Tan (eval e)
| Sinh e -> Math.Sinh (eval e)
| Cosh e -> Math.Cosh (eval e)
| Tanh e -> Math.Tanh (eval e)
| Asin e -> Math.Asin (eval e)
| Acos e -> Math.Acos (eval e)
| Atan e -> Math.Atan (eval e)
| Atan2(e1, e2) -> Math.Atan2(eval e1, eval e2)
| Abs e -> Math.Abs (eval e)
| Ceiling e -> Math.Ceiling (eval e)
| Floor e -> Math.Floor (eval e)
| Exp e -> Math.Exp (eval e)
| Log e -> Math.Log (eval e)
| Log10 e -> Math.Log10 (eval e)
| Min(e1, e2) -> Math.Min(eval e1, eval e2)
| Max(e1, e2) -> Math.Max(eval e1, eval e2)
| Pow(e1, e2) -> Math.Pow(eval e1, eval e2)
| Sqrt e -> Math.Sqrt (eval e)
| Round e -> Math.Round (eval e)
| Sign e -> Float.of_int (Math.Sign (eval e))
| Truncate e -> Math.Truncate (eval e)
| Factorial e -> Float.of_int (factorial (Int32.of_float (eval e)))
| Float f -> f
| Pi -> Math.PI
| E -> Math.E
Console.WriteLine (eval e)
Tillykke med din nye bog!
I kan downloade resten af vinder løsningen her.