smoltutor

Quiz 1

arithmetic operators

SMoL JavaScript Python
(deffun (f o) (o 1 1))
(f +)
function f(o) {
  return o(1, 1);
}
console.log(f((function(x, y) { return x + y; })));
def f(o):
    return o(1, 1)
print(f(+))

0 as condition

SMoL JavaScript Python
(if 0 #t #f)
console.log((0 ? true : false));
print(True if 0 else False)

redeclare var using defvar

SMoL JavaScript Python
(defvar x 0)
(defvar y x)
(defvar x 2)
x
y
let x = 0;
let y = x;
let x = 2;
console.log(x);
console.log(y);
x = 0
y = x
x = 2
print(x)
print(y)

expose local defvar

SMoL JavaScript Python
(defvar x 42)
(deffun (create)
  (defvar y 42)
  y)
(create)
(equal? x y)
let x = 42;
function create() {
  let y = 42;
  return y;
}
console.log(create());
console.log(x === y);
x = 42
def create():
    y = 42
    return y
print(create())
print(x == y)

pair?

SMoL JavaScript Python
(pair? (pair 1 2))
(pair? (ivec 1 2))
(pair? '#(1 2))
(pair? '(1 2))
N/A
N/A

let* and let

SMoL JavaScript Python
(let* ([v 1]
       [w (+ v 2)]
       [y (* w w)])
  (let ([v 3]
        [y (* v w)])
    y))
console.log(((v)=>{return ((w)=>{return ((y)=>{return ((v, y)=>{return y;})(3, v * w);})(w * w);})(v + 2);})(1));
N/A

defvar and let

SMoL JavaScript Python
(defvar x 3)
(defvar y (let ([y 6] [x 5]) x))
(* x y)
let x = 3;
let y = ((y, x)=>{return x;})(6, 5);
console.log(x * y);
N/A

fun-id equals to arg-id

SMoL JavaScript Python
(deffun (f f) f)
(f 5)
function f(f) {
  return f;
}
console.log(f(5));
def f(f):
    return f
print(f(5))

scoping rule of let

SMoL JavaScript Python
(let ([x 4]
      [y (+ x 10)])
  y)
console.log(((x, y)=>{return y;})(4, x + 10));
N/A

the right component of ivec

SMoL JavaScript Python
(right (ivec 1 2 3))
console.log(ivec(1, 2, 3)[1]);
print(ivec(1, 2, 3)[1])

identifiers

SMoL JavaScript Python
(defvar x 5)
(deffun (reassign var_name new_val)
  (defvar var_name new_val)
  (pair var_name x))
(reassign x 6)
x
let x = 5;
function reassign(var_name, new_val) {
  let var_name = new_val;
  return [ var_name, x ];
}
console.log(reassign(x, 6));
console.log(x);
x = 5
def reassign(var_name, new_val):
    var_name = new_val
    return [ var_name, x ]
print(reassign(x, 6))
print(x)

defvar, deffun, and let

SMoL JavaScript Python
(defvar a 1)
(deffun (what-is-a) a)
(let ([a 2])
  (ivec
   (what-is-a)
   a))
let a = 1;
function whatIsA() {
  return a;
}
console.log(((a)=>{return ivec(whatIsA(), a);})(2));
N/A

syntax pitfall

SMoL JavaScript Python
(deffun (f a b) a + b)
(f 5 10)
function f(a, b) {
  a;
  (function(x, y) { return x + y; });
  return b;
}
console.log(f(5, 10));
def f(a, b):
    a
    +
    return b
print(f(5, 10))

Quiz 2

circularity

SMoL JavaScript Python
(defvar x (mvec 2 3))
(set-right! x x)
(set-left! x x)
x
let x = [ 2, 3 ];
console.log(x[1]=x);
console.log(x[0]=x);
console.log(x);
x = [2, 3]
x[1] = x
x[0] = x
print(x)

eval order

SMoL JavaScript Python
(defvar x 0)
(ivec x (begin (set! x 1) x) x)
let x = 0;
console.log(ivec(x, (x = 1, x), x));
x = 0
print(ivec(x, [x := 1, x][-1], x))

mvec as arg

SMoL JavaScript Python
(defvar x (mvec 1 2))
(deffun (f x)
  (vset! x 0 0))
(f x)
x
let x = [ 1, 2 ];
function f(x) {
  return x[0] = 0;
}
console.log(f(x));
console.log(x);
x = [1, 2]
def f(x):
    return x.__setitem__(0, 0)
print(f(x))
print(x)

var as arg

SMoL JavaScript Python
(defvar x 12)
(deffun (f x)
  (set! x 0))
(f x)
x
let x = 12;
function f(x) {
  return x = 0;
}
console.log(f(x));
console.log(x);
x = 12
def f(x):
    return (x := 0)
print(f(x))
print(x)

seemly aliasing a var

SMoL JavaScript Python
(defvar x 5)
(deffun (set1 x y)
  (set! x y))
(deffun (set2 a y)
  (set! x y))
(set1 x 6)
x
(set2 x 7)
x
let x = 5;
function set1(x, y) {
  return x = y;
}
function set2(a, y) {
  return x = y;
}
console.log(set1(x, 6));
console.log(x);
console.log(set2(x, 7));
console.log(x);
x = 5
def set1(x, y):
    return (x := y)
def set2(a, y):
    global x
    return (x := y)
print(set1(x, 6))
print(x)
print(set2(x, 7))
print(x)

mutable var in vec

SMoL JavaScript Python
(defvar x 3)
(defvar v (mvec 1 2 x))
(set! x 4)
v
x
let x = 3;
let v = [ 1, 2, x ];
x = 4;
console.log(v);
console.log(x);
x = 3
v = [1, 2, x]
x = 4
print(v)
print(x)

aliasing mvec in mvec

SMoL JavaScript Python
(defvar v (mvec 1 2 3 4))
(defvar vv (mvec v v))(vset! (vref vv 1) 0 100)
vv
let v = [ 1, 2, 3, 4 ];
let vv = [ v, v ];
vv[1][0] = 100;
console.log(vv);
v = [1, 2, 3, 4]
vv = [v, v]
vv[1][0] = 100
print(vv)

vset! in let

SMoL JavaScript Python
(defvar x (mvec 123))
(let ([y x])
  (vset! y 0 10))
x
let x = [ 123 ];
console.log(((y)=>{return y[0] = 10;})(x));
console.log(x);
N/A

set! in let

SMoL JavaScript Python
(defvar x 123)
(let ([y x])
  (set! y 10))
x
let x = 123;
console.log(((y)=>{return y = 10;})(x));
console.log(x);
N/A

seemingly aliasing a var again

SMoL JavaScript Python
(defvar x 10)
(deffun (f y z)
  (set! x z)
  y)
(f x 20)
x
let x = 10;
function f(y, z) {
  x = z;
  return y;
}
console.log(f(x, 20));
console.log(x);
x = 10
def f(y, z):
    global x
    x = z
    return y
print(f(x, 20))
print(x)

Quiz 3

fun returns lambda

SMoL JavaScript Python
(deffun (f x)
  (lambda (y) (+ x y)))
((f 2) 1)
function f(x) {
  return function (y) {
    return x + y;
  };
}
console.log(f(2)(1));
def f(x):
    return lambda y: x + y
print(f(2)(1))

filter gt

SMoL JavaScript Python
(filter (lambda (n) (> 3 n)) '(1 2 3 4 5))
N/A
N/A

fun and state 1/4

SMoL JavaScript Python
(defvar x 1)
(defvar f
  (lambda (y)
    (+ x y)))
(set! x 2)
(f x)
let x = 1;
let f = function (y) {
  return x + y;
};
x = 2;
console.log(f(x));
x = 1
f = lambda y: x + y
x = 2
print(f(x))

fun and state 2/4

SMoL JavaScript Python
(defvar x 1)
(deffun (f y)
  (+ x y))
(set! x 2)
(f x)
let x = 1;
function f(y) {
  return x + y;
}
x = 2;
console.log(f(x));
x = 1
def f(y):
    return x + y
x = 2
print(f(x))

fun and state 3/4

SMoL JavaScript Python
(defvar x 1)
(defvar f
  (lambda (y)
    (+ x y)))
(let ([x 2])
  (f x))
let x = 1;
let f = function (y) {
  return x + y;
};
console.log(((x)=>{return f(x);})(2));
N/A

fun and state 4/4

SMoL JavaScript Python
(defvar x 1)
(deffun (f y)
  (+ x y))
(let ([x 2])
  (f x))
let x = 1;
function f(y) {
  return x + y;
}
console.log(((x)=>{return f(x);})(2));
N/A

eval order

SMoL JavaScript Python
(deffun (f x) (+ x 1))
(deffun (new-f x) (* x x))
(f (begin
     (set! f new-f)
     10))
function f(x) {
  return x + 1;
}
function newF(x) {
  return x * x;
}
console.log(f((f = newF, 10)));
def f(x):
    return x + 1
def new_f(x):
    return x * x
print(f([f := new_f, 10][-1]))

Counter

SMoL JavaScript Python
(deffun (make-counter)
  (let ([count 0])
    (lambda ()
      (begin
        (set! count (+ count 1))
        count))))
(defvar f (make-counter))
(defvar g (make-counter))
(f)
(g)
(f)
(f)
(g)
function makeCounter() {
  return ((count)=>{return function () {
    return (count = count + 1, count);
  };})(0);
}
let f = makeCounter();
let g = makeCounter();
console.log(f());
console.log(g());
console.log(f());
console.log(f());
console.log(g());
N/A

hof + set!

SMoL JavaScript Python
(defvar y 3)
(+ ((lambda (x) (set! y 0) (+ x y)) 1)
   y)
let y = 3;
console.log(function (x) {
  y = 0;
  return x + y;
}(1) + y);
y = 3
print(lambda x: ("WARNING: the translation might be inaccurate", (y := 0, x + y)[-1])[-1](1) + y)

filter

SMoL JavaScript Python
(defvar l (list (ivec) (ivec 1) (ivec 2 3)))
(filter (lambda (x) (vlen x)) l)
let l = list(ivec(), ivec(1), ivec(2, 3));
console.log(filter(function (x) {
  return x.length;
}, l));
l = list(ivec(), ivec(1), ivec(2, 3))
print(filter(lambda x: len(x), l))

eq? fun fun 1/3

SMoL JavaScript Python
(eq? (λ (x) (+ x x))
     (λ (x) (+ x x)))
console.log(λ(x(), x + x) === λ(x(), x + x));
print(λ(x(), x + x) == λ(x(), x + x))

eq? fun fun 2/3

SMoL JavaScript Python
(deffun (f x) (+ x x))
(deffun (g x) (+ x x))
(eq? f g)
function f(x) {
  return x + x;
}
function g(x) {
  return x + x;
}
console.log(f === g);
def f(x):
    return x + x
def g(x):
    return x + x
print(f == g)

eq? fun fun 3/3

SMoL JavaScript Python
(deffun (f x) (+ x x))
(deffun (g) f)
(eq? f (g))
function f(x) {
  return x + x;
}
function g() {
  return f;
}
console.log(f === g());
def f(x):
    return x + x
def g():
    return f
print(f == g())

equal? fun fun

SMoL JavaScript Python
(deffun (f) (lambda () 1))
(equal? (f) (f))
function f() {
  return function () {
    return 1;
  };
}
console.log(f() === f());
def f():
    return lambda: 1
print(f() == f())