Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
1+2*3;;
let pi = 4.0 *. atan 1.0;;
let square x = x *. x;;
square(sin pi) +. square(cos pi);;
1.0 * 2;;
let rec fib n =
if n < 2 then 1 else fib(n-1) + fib(n-2);;
fib 10;;
(1 < 2) = false;;
'a';;
"Hello world";;
let l = ["is"; "a"; "tale"; "told"; "etc."];;
"Life" :: l;;
let rec sort lst =
match lst with
| [] -> []
| head :: tail -> insert head (sort tail)
and insert elt lst =
match lst with
| [] -> [elt]
| head :: tail -> if elt <= head then elt :: lst else head :: insert elt tail
;;
sort l;;
sort [6;2;5;3];;
sort [3.14; 2.718];;
let deriv f dx = function x -> (f(x +. dx) -. f(x)) /. dx;;
let sin' = deriv sin 1e-6;;
sin' pi;;
let compose f g = function x -> f(g(x));;
let cos2 = compose square cos;;
List.map (function n -> n * 2 + 1) [0;1;2;3;4];;
let rec map f l =
match l with
| [] -> []
| hd :: tl -> f hd :: map f tl;;
type ratio = {num: int; denum: int};;
let add_ratio r1 r2 =
{num = r1.num * r2.denum + r2.num * r1.denum;
denum = r1.denum * r2.denum};;
add_ratio {num=1; denum=3} {num=2; denum=5};;
type number = Int of int | Float of float | Error;;
type sign = Positive | Negative;;
let sign_int n = if n >= 0 then Positive else Negative;;
let add_overflows i1 i2 =
sign_int i1 = sign_int i2 && sign_int(i1 + i2) <> sign_int i1;;
let add_num n1 n2 =
match (n1, n2) with
| (Int i1, Int i2) ->
if add_overflows i1 i2
then Float(float i1 +. float i2)
else Int(i1 + i2)
| (Int i1, Float f2) -> Float(float i1 +. f2)
| (Float f1, Int i2) -> Float(f1 +. float i2)
| (Float f1, Float f2) -> Float(f1 +. f2)
| (Error, _) -> Error
| (_, Error) -> Error;;
add_num (Int 123) (Float 3.14159);;
type 'a btree = Empty | Node of 'a * 'a btree * 'a btree;;
let rec member x btree =
match btree with
| Empty -> false
| Node(y, left, right) ->
if x = y then true else
if x < y then member x left else member x right;;
let rec insert x btree =
match btree with
| Empty -> Node(x, Empty, Empty)
| Node(y, left, right) ->
if x <= y then Node(y, insert x left, right)
else Node(y, left, insert x right);;
let add_vect v1 v2 =
let len = min (Array.length v1) (Array.length v2) in
let res = Array.create len 0.0 in
for i = 0 to len - 1 do
res.(i) <- v1.(i) +. v2.(i)
done;
res;;
add_vect [| 1.0; 2.0 |] [| 3.0; 4.0 |];;
type mutable_point = { mutable x: float; mutable y: float };;
let translate p dx dy =
p.x <- p.x +. dx; p.y <- p.y +. dy;;
let mypoint = { x = 0.0; y = 0.0 };;
translate mypoint 1.0 2.0;;
mypoint;;
let insertion_sort a =
for i = 1 to Array.length a - 1 do
let val_i = a.(i) in
let j = ref i in
while !j > 0 && val_i < a.(!j - 1) do
a.(!j) <- a.(!j - 1);
j := !j - 1
done;
a.(!j) <- val_i
done;;
let current_rand = ref 0;;
let random () =
current_rand := !current_rand * 25713 + 1345;
!current_rand;;
type 'a ref = { mutable contents: 'a };;
let (!) r = r.contents;;
let (:=) r newval = r.contents <- newval;;
type idref = { mutable id: 'a. 'a -> 'a };;
let r = {id = fun x -> x};;
let g s = (s.id 1, s.id true);;
r.id <- (fun x -> print_string "called id\n"; x);;
g r;;
exception Empty_list;;
let head l =
match l with
| [] -> raise Empty_list
| hd :: tl -> hd;;
head [1;2];;
head [];;
List.assoc 1 [(0, "zero"); (1, "one")];;
List.assoc 2 [(0, "zero"); (1, "one")];;
let name_of_binary_digit digit =
try
List.assoc digit [0, "zero"; 1, "one"]
with Not_found ->
"not a binary digit";;
name_of_binary_digit 0;;
name_of_binary_digit (-1);;
let temporarily_set_reference ref newval funct =
let oldval = !ref in
try
ref := newval;
let res = funct () in
ref := oldval;
res
with x ->
ref := oldval;
raise x;;
type expression =
Const of float
| Var of string
| Sum of expression * expression (* e1 + e2 *)
| Diff of expression * expression (* e1 - e2 *)
| Prod of expression * expression (* e1 * e2 *)
| Quot of expression * expression (* e1 / e2 *)
;;
exception Unbound_variable of string;;
let rec eval env exp =
match exp with
| Const c -> c
| Var v ->
(try List.assoc v env with Not_found -> raise(Unbound_variable v))
| Sum(f, g) -> eval env f +. eval env g
| Diff(f, g) -> eval env f -. eval env g
| Prod(f, g) -> eval env f *. eval env g
| Quot(f, g) -> eval env f /. eval env g;;
eval [("x", 1.0); ("y", 3.14)] (Prod(Sum(Var "x", Const 2.0), Var "y"));;
let rec deriv exp dv =
match exp with
| Const c -> Const 0.0
| Var v -> if v = dv then Const 1.0 else Const 0.0
| Sum(f, g) -> Sum(deriv f dv, deriv g dv)
| Diff(f, g) -> Diff(deriv f dv, deriv g dv)
| Prod(f, g) -> Sum(Prod(f, deriv g dv), Prod(deriv f dv, g))
| Quot(f, g) -> Quot(Diff(Prod(deriv f dv, g), Prod(f, deriv g dv)),
Prod(g, g))
;;
deriv (Quot(Const 1.0, Var "x")) "x";;
let print_expr exp =
(* Local function definitions *)
let open_paren prec op_prec =
if prec > op_prec then print_string "(" in
let close_paren prec op_prec =
if prec > op_prec then print_string ")" in
let rec print prec exp = (* prec is the current precedence *)
match exp with
Const c -> print_float c
| Var v -> print_string v
| Sum(f, g) ->
open_paren prec 0;
print 0 f; print_string " + "; print 0 g;
close_paren prec 0
| Diff(f, g) ->
open_paren prec 0;
print 0 f; print_string " - "; print 1 g;
close_paren prec 0
| Prod(f, g) ->
open_paren prec 2;
print 2 f; print_string " * "; print 2 g;
close_paren prec 2
| Quot(f, g) ->
open_paren prec 2;
print 2 f; print_string " / "; print 3 g;
close_paren prec 2
in print 0 exp;;
let e = Sum(Prod(Const 2.0, Var "x"), Const 1.0);;
print_expr e; print_newline();;
print_expr (deriv e "x"); print_newline();;
#load "camlp4o.cma";;
open Genlex;;
let lexer = make_lexer ["("; ")"; "+"; "-"; "*"; "/"];;
let token_stream = lexer(Stream.of_string "1.0 +x");;
Stream.next token_stream;;
Stream.next token_stream;;
Stream.next token_stream;;
let rec parse_expr = parser
[< e1 = parse_mult; e = parse_more_adds e1 >] -> e
and parse_more_adds e1 = parser
[< 'Kwd "+"; e2 = parse_mult; e = parse_more_adds (Sum(e1, e2)) >] -> e
| [< 'Kwd "-"; e2 = parse_mult; e = parse_more_adds (Diff(e1, e2)) >] -> e
| [< >] -> e1
and parse_mult = parser
[< e1 = parse_simple; e = parse_more_mults e1 >] -> e
and parse_more_mults e1 = parser
[< 'Kwd "*"; e2 = parse_simple; e = parse_more_mults (Prod(e1, e2)) >] -> e
| [< 'Kwd "/"; e2 = parse_simple; e = parse_more_mults (Quot(e1, e2)) >] -> e
| [< >] -> e1
and parse_simple = parser
[< 'Ident s >] -> Var s
| [< 'Int i >] -> Const(float i)
| [< 'Float f >] -> Const f
| [< 'Kwd "("; e = parse_expr; 'Kwd ")" >] -> e;;
let parse_expression = parser [< e = parse_expr; _ = Stream.empty >] -> e;;
let read_expression s = parse_expression(lexer(Stream.of_string s));;
read_expression "2*(x+y)";;
read_expression "x - 1";;
read_expression "x-1";;