Сравнение с JavaScript

Глобальные переменные

var foo = 'bar';
(def foo "bar")

Локальные переменные

const foo = 'bar';
...
(let [foo "bar"]
  ...)

Деструктурирование

const person = {
  fname: 'John',
  mname: 'J',
  lname: 'Doe'
}

const { fname, lname } = person;
...

const color = [255, 255, 100, 0.7];

const [r, , b, a] = color;
...
(def person {:fname "John"
             :mname "J"
             :lname "Doe"})

(let [{:keys [fname lname]} person]
  ...)

(def color [255 255 100 0.7])

(let [[r _ b a] color]
  ...)

Массивы

const arr = [1, 2, 3];
(def arr #js [1 2 3])

Объекты

const obj = { foo: 'bar' };
(def obj #js {:foo "bar"})

Неизменяемые списки, векторы, множества и словари

// Отсутствуют
// Реализованы в библиотеках Immutable.js и mori
(def l '(1 2 3))
(def v [1 2 3])
(def s #{1 2 3})
(def m {:foo "bar"})

Доступ к значениям в коллекциях

const obj = { foo: 'bar' };
obj.foo

const arr = [1, 2, 3];
arr[1]
(def obj {:foo "bar"})
(:foo obj)
;; ключевые слова — это функции

(def arr [1 2 3])
(nth arr 1)

Добавление значений в коллекции

const obj = { foo: 'bar' };
obj.foo = 'baz';

const arr = [1, 2, 3];
arr.push(4);
(def obj {:foo "bar"})
(assoc obj :foo "baz")
;; создает новую коллекцию, не изменяя оригинал

(def arr [1 2 3])
(conj arr 4)
;; создает новую коллекцию, не изменяя оригинал

Проверка равенства

// Сравнение по ссылке
const a = [1, 2, 3];
const b = [1, 2, 3];
a === b // false
;; Сравнение по значению
(def a [1 2 3])
(def b [1 2 3])
(= a b) ;; true

Приведение типов к булевому типу

// false
false
0
''
null
undefined
NaN
// все остальное true
;; false
nil
false
;; все остальное true

Ветвление

const arr = [1, 2, 3];

if (arr.length > 0) {
  ...
}
(def arr #js [1 2 3])

(if (pos? (count arr))
  ...)

Функции

function foo() {
  ...
}
(defn foo []
  ...)

Возвращение значения из функции

function foo() {
  return 'bar';
}
(defn foo []
  "bar")

Полиморфизм

function foo() {
  if (arguments.length === 1) {
    return 'one';
  }
  if (arguments.length === 2) {
    return 'two';
  }
  if (arguments.length === 3) {
    return 'three';
  }
}
(defn foo
  ([a] "one")
  ([a b] "two")
  ([a b c] "three"))

Остаточные параметры

function foo(a, b, ...args) {
  ...
}
(defn foo [a b & args]
  ...)