Functional
Haskell, Scheme, Common Lisp and Clojure
Haskell | Scheme (R5RS) | Common Lisp | Clojure | |
---|---|---|---|---|
function literal | (\x y -> x^2 + y^2) 3 4 -> 25 | ((lambda (x y) (+ (* x x) (* y y))) 3 4) -> 25 | ((lambda (x y) (+ (* x x) (* y y))) 3 4) -> 25 | ((fn [x y] (+ (* x x) (* y y))) 3 4) (#(+ (* % %) (* %2 %2)) 3 4) |
bind a function literal to a variable | sos = (\x y -> x^2 + y^2) sos 3 4 -> 25 in ghci 'let' is needed. | (define sos (lambda (x y) (+ (* x x) (* y y))) (sos 3 4) -> 25 | (setq sos (lambda (x y) (+ (* x x) (* y y))) | (def sos (fn [x y] (+ (* x x) (* y y))) (sos 3 4) -> 25 |
bind a function literal to a variable in a scope | let sos = (\x y -> x^2 + y^2) in sos 3 4 -> 25 sos 3 4 -> Not in scope: `sos' | (let ((sos (lambda (x y) (+ (* x x) (* y y))))) | (let [sos (fn [x y] (+ (* x x) (* y y)))] (sos 3 4)) -> 25 (sos 3 4) -> Unable to resolve symbol: sos | |
named function | sos x y = x^2 + y^2 | (define (sos x y) (+ (* x x) (* y y))) (sos 3 4) -> 25 | (defun sos (x y) (+ (* x x) (* y y))) (sos 3 4) -> 25 | (defn sos [x y] (+ (* x x) (* y y))) (sos 3 4) -> 25 |
named function in a scope | let sos x y = x^2 + y^2 in | (labels ((sos (x y) (+ (* x x) (* y y)))) | (letfn [(sos [x y] (+ (* x x) (* y y)))] (sos 3 4)) -> 25 | |
Haskell | Scheme (R5RS) | Common Lisp | Clojure | |
car,head,first (3,1,4,1,5,9,2) -> 3 | head [3,1,4,1,5,9,2] -> 3 | (car '(3 1 4 1 5 9 2)) -> 3 | (car '(3 1 4 1 5 9 2)) -> 3 | (first '(3 1 4 1 5 9 2)) -> 3 |
cdr,tail,next (3,1,4,1,5,9,2) -> (1,4,1,5,9,2) | tail [3,1,4,1,5,9,2] -> [1,4,1,5,9,2] | (cdr '(3 1 4 1 5 9 2)) -> (1 4 1 5 9 2) | (cdr '(3 1 4 1 5 9 2)) -> (1 4 1 5 9 2) | (rest '(3 1 4 1 5 9 2)) -> (1 4 1 5 9 2) |
cons 3 (1,4,1,5,9,2) -> (3,1,4,1,5,9,2) | 3:[1,4,1,5,9,2] -> [3,1,4,1,5,9,2] | (cons 3 '(1 4 1 5 9 2)) -> (3 1 4 1 5 9 2) | (cons 3 '(1 4 1 5 9 2)) -> (3 1 4 1 5 9 2) | (cons 3 '(1 4 1 5 9 2)) (conj '(1 4 1 5 9 2) 3) |
append,concat (3,1,4) (1,5,9,2) -> (3,1,4,1,5,9,2) | [3,1,4] ++ [1,5,9,2] -> [3,1,4,1,5,9,2] | (append '(3 1 4) '(1 5 9 2)) -> (3 1 4 1 5 9 2) | (append '(3 1 4) '(1 5 9 2)) -> (3 1 4 1 5 9 2) | (concat '(3 1 4) '(1 5 9 2)) -> (3 1 4 1 5 9 2) |
take | take 5 [3,1,4,1,5,9,2] -> [3,1,4,1,5] | (use srfi-1) | (take 5 '(3 1 4 1 5 9 2)) -> (3 1 4 1 5) | |
drop 5 (3,1,4,1,5,9,2) -> (9,2) | drop 5 [3,1,4,1,5,9,2] -> [9,2] | (use srfi-1) (drop '(3 1 4 1 5 9 2) 5) -> (9 2) | (drop 5 '(3 1 4 1 5 9 2)) -> (9 2) | |
Haskell | Scheme (R5RS) | Common Lisp | Clojure | |
take-while odd? (3,1,4,1,5,9,2) -> (3,1) | takeWhile odd [3,1,4,1,5,9,2] -> [3,1] | (take-while odd? '(3 1 4 1 5 9 2)) -> (3 1) | ||
drop-while odd? (3,1,4,1,5,9,2) -> (4,1,5,9,2) | dropWhile odd [3,1,4,1,5,9,2] -> [4,1,5,9,2] | (drop-while odd? '(3 1 4 1 5 9 2)) -> (4 1 5 9 2) | ||
map square (3,1,4,1,5,9,2) -> (9,1,16,1,25,81,4) | map (\x -> x^2) [3,1,4,1,5,9,2] -> [9,1,16,1,25,81,4] | (map (lambda (x) (* x x)) '(3 1 4 1 5 9 2)) | (map #(* % %) '(3 1 4 1 5 9 2)) | |
filter odd? (3,1,4,1,5,9,2) -> (3,1,1,5,9) | filter odd [3,1,4,1,5,9,2] -> [3,1,1,5,9] | (use srfi-1) (filter odd? '(3 1 4 1 5 9 2)) -> (3 1 1 5 9) | (filter odd? '(3 1 4 1 5 9 2)) -> (3 1 1 5 9) | |
fold-right f (3,1,4,1) 5 -> f(5, f(1, f(4, f(1, 3)))) | x2y x y = x^2 + y | (define (x2y x y) (+ (* x x) y)) | (defun x2y (x y) (+ (* x x) y)) | (defn x2y [x y] (+ (* x x) y)) (reduce #(x2y %2 %) 5 '(3 1 4 1)) -> 32 |
fold-left f 3 (1,4,1,5) -> f(f(f(f(3, 1), 4), 1) 5) | x2y x y = x^2 + y foldl x2y 3 [1,4,1,5] -> 117007494 | [R6RS] has fold-left | (defun x2y (x y) (+ (* x x) y)) | (defn x2y [x y] (+ (* x x) y)) (reduce x2y 3 '(1 4 1 5)) -> 117007494 |
reduce-right f (3,1,4,1,5) -> f(f(f(f(3, 1), 4), 1), 5) | x2y x y = x^2 + y foldr1 x2y [3,1,4,1,5] -> 32 | |||
reduce-left f (3,1,4,1,5) -> f(f(f(f(3, 1), 4), 1), 5) | x2y x y = x^2 + y foldl1 x2y [3,1,4,1,5] -> 117007494 | (defun x2y (x y) (+ (* x x) y)) (reduce #'x2y '(3 1 4 1 5)) -> 117007494 | ||
Haskell | Scheme (R5RS) | Common Lisp | Clojure | |
nth 2 (3, 1, 4, 1, 5) -> 4 | [3,1,4,1,5]!!2 -> 4 | (use srfi-1) (car (drop '(3 1 4 1 5) 2)) -> 4 | (nth 2 '(3 1 4 1 5)) -> 4 | (nth '(3 1 4 1 5) 2) -> 4 |
elem, member 2 (3,1,4,1,5,9,2) -> true 7 (3,1,4,1,5,9,2) -> false | elem 2 [3,1,4,1,5,9,2] -> True elem 7 [3,1,4,1,5,9,2] -> False | (member 2 '(3 1 4 1 5 9 2)) -> (2) (member 7 '(3 1 4 1 5 9 2)) -> #f | (member 2 '(3 1 4 1 5 9 2)) -> (2) (member 7 '(3 1 4 1 5 9 2)) -> NIL | (some #(= % 2) '(3 1 4 1 5 9 2)) |
some, any even? '(3 1 4 1) -> true even? '(3 5 7 9) -> false | any even [3,1,4,1] | (any even? '(3 1 4 1)) | (some even? '(3 1 4 1)) -> true (some even? '(3 5 7 9)) -> nil | |
every?, all odd? '(3 1 4 1) -> false odd? '(3 5 7 9) -> true | all odd [3,1,4,1] -> False all odd [3,5,7,9] -> True | (use srfi-1) | (every? odd? '(3 1 4 1)) -> false (every? odd? '(3 5 7 9)) -> true | |
Haskell | Scheme (R5RS) | Common Lisp | Clojure | |
0, 1, 2, ... infinite | [0..] -> [0,1,2,...infinitely] | (range) -> (0 1 2 ... infinitely) | ||
0, 1, 2, 3, 4 | [0..4] -> [0,1,2,3,4] | (use srfi-1) (iota 5) -> (0 1 2 3 4) | (range 5) | |
2, 3, 4, 5, 6 | [2..6] -> [2,3,4,5,6] | (use srfi-1) (iota 5 2) -> (2 3 4 5 6) | (range 2 7) | |
3, 5, 7, 9, 11 | [3,5..11] -> [3,5,7,9,11] | (use srfi-1) (iota 5 3 2) -> (3 5 7 9 11) | (range 3 12 2) -> (3 5 7 9 11) | |
(3, 1, 4, 1, 5) -> 14 | sum [3,1,4,1,5] foldl (+) 0 [3,1,4,1,5] | (apply + '(3 1 4 1 5)) (fold-right + 0 '(3 1 4 1 5)) | (apply #'+ '(3 1 4 1 5)) (reduce #'+ '(3 1 4 1 5)) | (apply + '(3 1 4 1 5)) (reduce + 0 '(3 1 4 1 5)) |
unfold x f g -> x, f(x), f(f(x)), ... unless g(n) | x2 x = 2 * x | (use srfi-1) (define (x2 x) (* 2 x)) (define (le100 x) (<= 100 x)) (unfold le identity x2 1) -> (1 2 4 8 16 32 64) | (defun x2 (x) (* 2 x)) | |
iterate | iterate (2 *) 1 -> [1,2,4,8,16,... infinitely] | (iterate (partial * 2) 1) -> (1 2 4 8 16 ... infinitely) | ||
finite iterate x f 5 -> x, f(x), f(f(x)), f(f(f(x))), f(f(f(f(x)))) | take 5 $ iterate (2 *) 1 -> [1,2,4,8,16] | |||
repeat x -> (x, x, x, ...) | repeat 2 -> [2,2,2,2,2,... infinitely] | (repeat 2) -> (2 2 2 2 2 ... infinitely) | ||
finite repeat x 5 -> (x, x, x, x, x) | take 5 $ repeat 2 -> [2,2,2,2,2] | (make-list 5 2) -> (2 2 2 2 2) | (take 5 (repeat 2)) | |
Haskell | Scheme (R5RS) | Common Lisp | Clojure | |
assoc | ||||
show contents of a file | (print (slurp "hoge.clj")) |
JavaScript, Scala, OCaml and F#
JavaScript | Scala | OCaml | F# | |
---|---|---|---|---|
function literal | function (x, y) {return x * x + y * y;}(3,4) -> 25 | ((x:Int, y:Int) => x * x + y * y)(3, 4) -> Int = 25 | (fun x y ->x * x + y * y) 3 4;; int = 25 | (fun x y -> x * x + y * y) 3 4;; |
bind a function literal to a variable | var sos =function (x, y) {return x * x + y * y;}; sos(3,4) -> 25 | var sos =(x:Int, y:Int) => x * x + y * y sos(3,4) -> Int = 25 | let sos = fun x y -> x * x + y * y;; | let sos = fun x y -> x * x + y * y;; sos 3 4;; -> int = 25 |
bind a function literal to a variable in a scope | function () { | (() => { | let sos = fun x y -> x * x + y * y in sos 3 4;; -> int = 25 sos 3 4;; -> Unbound value sos | let sos = fun x y -> x * x + y * y in sos 3 4 |
named function | function sos(x, y) {return x * x + y * y;}; sos(3,4) -> 25 | def sos(x:Int, y:Int) = x * x + y * y sos(3, 4) -> Int = 25 | let sos x y = x * x + y * y;; sos 3 4;; -> int = 25 | let sos x y = x * x + y * y;; sos 3 4;; -> int = 25 |
named function in a scope | function () { function sos(x, y) {return x * x + y * y;}; return sos(3, 4); }() -> 25 sos(3, 4) -> sos is not defined | (() => { def sos(x:Int, y:Int) = x * x + y * y sos(3, 4) })() -> Int = 25 sos(3, 4) -> not found: value sos | let sos x y = x * x + y * y in sos 3 4;; -> int = 25 sos 3 4;; -> Unbound value sos | let sos x y = x * x + y * y in sos 3 4;; -> int = 25 sos 3 4;; -> The value or constructor 'sos' is not defined |
JavaScript | Scala | OCaml | F# | |
car,head,first (3,1,4,1,5,9,2) -> 3 | List(3,1,4,1,5,9,2).head -> Int = 3 | |||
cdr,tail,next (3,1,4,1,5,9,2) -> (1,4,1,5,9,2) | List(3,1,4,1,5,9,2).tail -> List[Int] = List(1,4,1,5,9,2) | |||
cons 3 (1,4,1,5,9,2) -> (3,1,4,1,5,9,2) | 3::List(1,4,1,5,9,2) -> List[Int] = List(3,1,4,1,5,9,2) | |||
append,concat (3,1,4) (1,5,9,2) -> (3,1,4,1,5,9,2) | List(3,1,4):::List(1,5,9,2) -> List[Int] = List(3,1,4,1,5,9,2) | |||
take | ||||
drop 5 (3,1,4,1,5,9,2) -> (9,2) | ||||
JavaScript | Scala | OCaml | F# | |
take-while odd? (3,1,4,1,5,9,2) -> (3,1) | ||||
drop-while odd? (3,1,4,1,5,9,2) -> (4,1,5,9,2) | ||||
map square (3,1,4,1,5,9,2) -> (9,1,16,1,25,81,4) | List(3,1,4,1,5,9,2).map(x => x * x) -> List[Int] = List(9,1,16,1,25,81,4) | |||
filter odd? (3,1,4,1,5,9,2) -> (3,1,1,5,9) | List(3,1,4,1,5,9,2).filter(x => x % 2 != 0) -> List[Int] = List(3,1,1,5,9) | |||
fold-right f (3,1,4,1) 5 -> f(5, f(1, f(4, f(1, 3)))) | def x2y(x:Int, y:Int) = x*x + y (List(3,1,4,1) :\ 5){x2y} | |||
fold-left f 3 (1,4,1,5) -> f(f(f(f(3, 1), 4), 1) 5) | def x2y(x:Int, y:Int) = x*x + y (3 /: List(1,4,1,5)){x2y} | |||
reduce-left f (3,1,4,1,5) -> f(f(f(f(3, 1), 4), 1), 5) | def x2y(x:Int, y:Int) = x*x + y List(3,1,4,1,5).reduceLeft(x2y) -> Int = 117007494 | |||
reduce-right f (3,1,4,1,5) -> f(f(f(f(3, 1), 4), 1), 5) | def x2y(x:Int, y:Int) = x*x + y List(3,1,4,1,5).reduceRight(x2y) -> 32 | |||
JavaScript | Scala | OCaml | F# | |
nth 2 (3, 1, 4, 1, 5) -> 4 | ||||
elem, member 2 (3,1,4,1,5,9,2) -> true 7 (3,1,4,1,5,9,2) -> false | ||||
some, any even? '(3 1 4 1) -> true even? '(3 5 7 9) -> false | ||||
every?, all odd? '(3 1 4 1) -> false odd? '(3 5 7 9) -> true | ||||
JavaScript | Scala | OCaml | F# | |
0, 1, 2, ... infinite | ||||
0, 1, 2, 3, 4 | List.range(0,5) -> List[Int] = List(0,1,2,3,4) | |||
2, 3, 4, 5, 6 | List.range(2,7) -> List[Int] = List(2,3,4,5,6) | |||
3, 5, 7, 9, 11 | List.range(3,12,2) -> List[Int] = List(3,5,7,9,11) | |||
(3, 1, 4, 1, 5) -> 14 | ||||
unfold x f g -> x, f(x), f(f(x)), ... until g(x) | ||||
iterate | ||||
finite iterate x f 5 -> x, f(x), f(f(x)), f(f(f(x))), f(f(f(f(x)))) | ||||
repeat x -> (x, x, x, ...) | ||||
finite repeat x 5 -> (x, x, x, x, x) | ||||
JavaScript | Scala | OCaml | F# | |
assoc | ||||
show contents of a file |
Processors
Haskell | Glasgow Haskell Compiler (GHC) Hugs 98 |
Scheme | Gauche GNU Guile Racket (PLT Scheme) MIT Scheme |
Common Lisp | Steeel Bank Common Lisp (SBCL) |
Clojure | Clojure |
Standard ML | Standard ML of New Jersey (SML/NJ) MLton SML# |
OCaml | OCaml (INRIA) |
F# | F# (Microsoft) |
Scala | Scala |
JavaScript | Node.js Rhino |
GHC | Gauche | SBCL | CLISP | Clojure | Node.js | Scala | OCaml | Mono F# | |
---|---|---|---|---|---|---|---|---|---|
interpreter | ghci | gosh | sbcl | clisp | java clojure.main | node | java scala.tools.nsc.MainGenericRunner (Use a bundled script instead) | ocaml | fsi |
command line editting | built-in | rlwrap | rlwrap | built-in | rlwrap | built-in | rlwrap | ledit | built-in |
exit interpreter | :quit | (exit) | (quit) | (exit) (quit) | (System/exit 0) ^D | ^D | exit :quit | #quit;; | #quit;; |
import a library | :m +Data.List | (use srfi-1) | (use 'clojure.java.io) | ||||||
load a source file | :l hoge.hs :l hoge | (load "./hoge.scm") | (load "hoge.lisp") | (load "hoge.lisp") | (load-file "hoge.clj") | :l hoge.scala | #use "hoge.cma" | #load "hoge.fsx" note: | |
execute a script without compiling | |||||||||
compile and execute | |||||||||
args | $ cat args.scm | ||||||||
multi line | :{ |
LISPs
5 Basic Functions
Scheme | Common Lisp | Clojure | |
---|---|---|---|
1. car | car | car, first | first |
2. cdr | cdr | cdr, rest | rest |
3. cons | cons | cons | cons |
4. atom | (lambda (x) (not (pair? x))) | atom | #(not (list? %)) |
5. eq | eq? | eq | = |
Special Forms (Syntax)
scheme | Common Lisp | Clojure | |
---|---|---|---|
cond | cond | cond | cond |
lambda | lambda | lambda | fn |
define | define | set | def |
Other Basics
scheme | Common Lisp | Clojure | |
---|---|---|---|
(= 0 0) | #t | T | true |
(= 0 1) | #f | NIL | false |
def x2y(x:Int, y:Int) = x*x + y