Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 27 Next »

Functional

Haskell, Scheme, Common Lisp and Clojure

 HaskellScheme (R5RS)Common LispClojure
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)
-> 25

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)))
(funcall sos 3 4)
-> 25

(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)))))
(sos 3 4))
-> 25
(sos 3 4)
-> unbound variable: sos 

(let ((sos (lambda (x y) (+ (* x y) (* y y)))))
(funcall sos 3 4))
-> 25
(funcall sos 3 4)
-> The variable SOS is unbound

 

(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
sos 3 4
-> 25 

(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
sos 3 4
-> 25 

 

(labels ((sos (x y) (+ (* x x) (* y y))))
(sos 3 4))
-> 25
(sos 3 4)
-> undefined function sos 

(letfn [(sos [x y] (+ (* x x) (* y y)))]
(sos 3 4))
-> 25 
 HaskellScheme (R5RS)Common LispClojure
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))
-> (3 1 4 1 5 9 2)

(conj '(1 4 1 5 9 2) 3)
-> (3 1 4 1 5 9 2) 

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
5 (3,1,4,1,5,9,2) -> (3,1,4,1,5)

take 5 [3,1,4,1,5,9,2]
-> [3,1,4,1,5]

(use srfi-1)
(take '(3 1 4 1 5 9 2) 5)
-> (3 1 4 1 5)

(labels
((take (n ls)
(if (or (<= n 0) (null ls)) nil
(cons (car ls) (take (1- n) (cdr ls))))))
(take 5 '(3 1 4 1 5 9 2)))
->  (3 1 4 1 5)

(subseq '(3 1 4 1 5 9 2) 0 5)
-> (3 1 4 1 5) 

(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) 

(labels
((drop (n ls)
(if (or (<= n 0) (null ls)) ls
(drop (1- n) (cdr ls)))))
(drop 5 '(3 1 4 1 5 9 2)))
-> (9 2)

(drop 5 '(3 1 4 1 5 9 2))
-> (9 2) 
 HaskellScheme (R5RS)Common LispClojure
take-while
odd? (3,1,4,1,5,9,2) -> (3,1) 
takeWhile odd [3,1,4,1,5,9,2]
-> [3,1]

(letrec
((take-while
(lambda (p ls)
(if (p (car ls))
(cons (car ls) (take-while p (cdr ls)))
'()))))
(take-while 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]

(letrec
((drop-while
(lambda (p ls)
(if (p (car ls))
(drop-while p (cdr ls))
ls))))
(drop-while 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))
-> (9 1 16 1 25 81 4)

 

(map #(* % %) '(3 1 4 1 5 9 2))
-> (9 1 16 1 25 81 4)

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
foldr x2y 5 [3,1,4,1]
-> 32

(define (x2y x y) (+ (* x x) y))
(fold x2y 5 '(3 1 4 1))
-> 32

(defun x2y (x y) (+ (* x x) y))
(reduce #'(lambda (y x) (x2y x y)) '(3 1 4 1) :initial-value 5)
-> 32

(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 

(define (x2y x y) (+ (* x x) y))
(letrec
((fold-left
(lambda (f h ls)
(if (null? ls) h
(fold-left f (f h (car ls)) (cdr ls))))))
(fold-left x2y 3 '(1 4 1 5)))
-> 117007494 

[R6RS] has fold-left 

(defun x2y (x y) (+ (* x x) y))
(reduce #'x2y '(1 4 1 5) :initial-value 3)
-> 117007494

(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
 
 HaskellScheme (R5RS)Common LispClojure
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))
-> true
(some #(= % 7) '(3 1 4 1 5 9 2))
-> nil

some, any
even? '(3 1 4 1) -> true
even? '(3 5 7 9) -> false 

any even [3,1,4,1]
-> True
any even [3,5,7,9]
-> False 

(any even? '(3 1 4 1))
-> #t
(any even? '(3 5 7 9))
-> #f

 (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))
-> #f
(every odd? '(3 5 7 9))
-> #t

 (every? odd? '(3 1 4 1))
-> false
(every? odd? '(3 5 7 9))
-> true 
 HaskellScheme (R5RS)Common LispClojure
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)
-> (0 1 2 3 4) 

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)
->  (2 3 4 5 6)

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]
-> 14

foldl (+) 0 [3,1,4,1,5]
-> 14 

(apply + '(3 1 4 1 5))
-> 14

(fold-right + 0 '(3 1 4 1 5))
-> 14 

(apply #'+ '(3 1 4 1 5))
-> 14

(reduce #'+ '(3 1 4 1 5))
-> 14 

(apply + '(3 1 4 1 5))
-> 14

(reduce + 0 '(3 1 4 1 5))
-> 14 

unfold
x f g
-> x, f(x), f(f(x)), ... unless g(n)

x2 x = 2 * x
le100 x = 100 <= x
takeWhile (not . le100) $ iterate x2 1
-> [1,2,4,8,16,32,64] 

(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))
(defun le100 (x) (<= 100 x))
(labels
((unfold (p f g s)
(if (funcall p s) nil
(cons (funcall f s)
(unfold p f g (funcall g s))))))
(unfold #'le100 #'x2 1))
-> (1 2 4 8 16 32 64)

 

iterate
x f
-> x, f(x), f(f(x)), f(f(f(x))), ...

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))
 HaskellScheme (R5RS)Common LispClojure
assoc    
show contents of a file   (print (slurp "hoge.clj"))

JavaScript, Scala, OCaml and F#

 JavaScriptScalaOCamlF#
function literalfunction(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;;
-> int = 25

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;;
sos 3 4;;
-> int = 25

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(){
var sos = function(x, y){return x*x + y*y};
return sos(3, 4);
}()
-> 25
sos(3,4)
-> sos is not defined

(() => {
var sos = (x:Int, y:Int) => x*x + y*y
sos(3, 4)
})()
-> Int = 25
sos(3, 4)
-> not found: value sos 

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
-> int = 25
sos 3 4;;
-> The value or constructor 'sos' is not defined 

named functionfunction 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 scopefunction(){
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 
 JavaScriptScalaOCamlF#
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
5 (3,1,4,1,5,9,2) -> (3,1,4,1,5)

    
drop
5 (3,1,4,1,5,9,2) -> (9,2) 
    
 JavaScriptScalaOCamlF#
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).
foldRight(5){x2y}
-> Int = 32

(List(3,1,4,1) :\ 5){x2y}
-> Int = 32

  
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
List(1,4,1,5).foldLeft(3){x2y}
-> Int = 117007494

(3 /: List(1,4,1,5)){x2y}
-> Int = 117007494 

  
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 
  
 JavaScriptScalaOCamlF#
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 
    
 JavaScriptScalaOCamlF#
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
x f
-> x, f(x), f(f(x)), f(f(f(x))), ...

    
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)
    
 JavaScriptScalaOCamlF#
assoc    
show contents of a file    

Processors

 GHCGaucheSBCLCLISPClojureNode.jsScalaOCamlMono F#
interpreterghcigoshsbclclispjava clojure.mainnodejava scala.tools.nsc.MainGenericRunner
(Use a bundled script instead)
ocamlfsi
command line edittingbuilt-inrlwraprlwrapbuilt-inrlwrapbuilt-inrlwrapleditbuilt-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:
.fs is used for things belonging to some name space. use .fsx if you want it as just a script. 

execute a script
without compiling 
         
compile and execute         
args

$ cat args.scm
(define (main args)
(print args)
(print (car args))
(print (cdr args)))
$ gosh args.scm a b c
(args.scm a b c)
args.scm
(a b c)

        
multi line

:{
:} 

        

 

LISPs

5 Basic Functions

 SchemeCommon LispClojure

1. car

carcar, firstfirst
2. cdrcdrcdr, restrest
3. consconsconscons
4. atom(lambda (x) (not (pair? x)))atom#(not (list? %))
5. eq

eq?

eq=

Special Forms (Syntax)

 schemeCommon LispClojure
condcondcondcond
lambdalambdalambdafn
definedefinesetdef

Other Basics

 schemeCommon LispClojure
(= 0 0)#tTtrue
(= 0 1)#fNILfalse

 

Y.Kohyama

  • No labels