С Вашим примером так и до хаскеля недалеко, уж очень синтаксис нестандартный в этом LiveScript. Я так понял, что восклицательный знак как то обозначает асинхронную операцию.
(define (discriminant a b c)
(- (* b b) (* 4 a c)))
(define (solve a b c)
(let ((d (discriminant a b c)))
(cond ((< d 0) (error "уравнение не имеет действительных корней"))
((= d 0) (- (/ b (* 2 a))))
(else (list (/ (+ (- b) (sqrt d)) (* 2 a))
(/ (- (- b) (sqrt d)) (* 2 a)))))))
(solve 1 8 7)
Если следовать основной мысли подхода, а именно учить не языку, а решению задач, то я предлагаю Scheme. Сам я начинал с С. Так вот, для того что б начать программировать на С, нужно хоть базово знать архитектуру процессора и основы организации памяти в компьютере.
Подробно изучите возможности деструктуризации (destructuring assignment), именно она применяется для разбора параметров.
В данном случае в теле функции foo будут доступны две переменные — from и to, значениями которых будут {bar:2, foo: 3} и 5 соответственно.
Не вводите людей в заблуждение. Замыкания в JavaScript как раз лексические.
А вот контекст и вправду динамический. Но как только ты об этом узнаеш, вся магия исчезает. Это фича JavaScript.
Мне тоже нравятся строготипизированные функциональные языки, и именно поэтому я люблю JavaScript. Ведь до недавнего времени только на JavaScript (среди прочих мейнстрим языков) можно было хоть как-то писать в функциональном стиле (функции как сущности первого порядка, замыкания).
Боюсь что еще нескоро такие языки как OCaml, Haskell, даже Scala, получат значительную долю на рынке.
Для себя сделал такое заключение.
Основная проблема при понимании реализации ООП в JavaScript — модель наследования. Она отличается от популярних языков.
Все привыкли к иерархическому наследованию, тогда как в JavaScript другая модель — делегирующее наследование.
В JavaScript нет ключевого слова extend, вот тут у многих начинается паника. И вместо того чтоб разобратся с теми возможностями, которые предоставляет JavaScript, они ставят клеймо на язык «недоООП».
Тем не менее на JavaScript можно реализовать и иерархическое наследование. В таких случаях и делают разные обертки для того чтоб не повторять каждый раз одно и тоже. Здесь я поддерживаю предложение синтаксиса классов в ES6.
Ну так это просто синтаксический сахар. Прототипы никуда не денутся.
Лично для меня ES6 классы — это:
1) декларативное описание иерархическое наследование (как у C/C++/Java)
2) унификация обьявления классов (вместо собственного велосипеда)
Все шаблоны собираються вместе с кодом приложения в один файл app.js. Но если взять отдельный шаблон, тогда получается так: исходный шаблон — 1.4 КБ, скомпилированный — 3,8 КБ.
Да, размер на самом деле больше. Вы заставили меня задуматся. Правда у меня сейчас не так много шаблонов, что б волноватся за их размер.
Но надо заметить, что часть кода сжимается js минификатором и думаю для одностраничных приложений, где много кода приложения, шаблоны не будут сильно влиять на итоговый размер.
На своих проектах использую brunch + handlebars + live reload plugin. В результате все шаблоны скомпилированы, brunch следит за изменениями, а live reload прямо перегружает браузер. Очень удобно!
По поводу доступа. Все шаблоны лежат в папке app/templates. В скомпилированом коде это просто javascript функции, которые доступны как CommonJS модули.
Для примера есть шаблон app/templates/main-layout.hbs. В програмном коде пишем:
var mainLayoutTmpl = require('templates/main-layout');
var renderedTmpl = mainLayoutTmpl({ title: 'Hello world!' });
Мне например легче читать функциональний вариант нежели императивный (возможно из за того что я плохо знаком с Python). В результате мы получаем и используем некий DSL, который да, нужно понимать. Минус в том, что этот DSL надо описать, и здесь Python не настолько удобен и местами избыточен. Но надо заметить один факт: мы получаем код, разбитий на маленькие кусочки. Декомпозиция в действии. Каждый кусочек можна расматривать отдельно, и что самое главное на мой взгляд, на основе этих мелким елементов можна построить все более и более сложные блоки, при этом сохраняя простоту и независимость каждого из них. Вот вам и повторное использование кода! Чем больше императивного кода, тем сложнее разобратся что же он делает в конце концов.
Разве все так ужасно выглядит?
В данном случае в теле функции foo будут доступны две переменные — from и to, значениями которых будут {bar:2, foo: 3} и 5 соответственно.
Callbacks are imperative, promises are functional: Node’s biggest missed opportunity
Broken Promises
Broken Promises
Callbacks, promises and simplicity
Лично я предпочитаю callbacks как более простое решение.
А вот контекст и вправду динамический. Но как только ты об этом узнаеш, вся магия исчезает. Это фича JavaScript.
Боюсь что еще нескоро такие языки как OCaml, Haskell, даже Scala, получат значительную долю на рынке.
Основная проблема при понимании реализации ООП в JavaScript — модель наследования. Она отличается от популярних языков.
Все привыкли к иерархическому наследованию, тогда как в JavaScript другая модель — делегирующее наследование.
В JavaScript нет ключевого слова extend, вот тут у многих начинается паника. И вместо того чтоб разобратся с теми возможностями, которые предоставляет JavaScript, они ставят клеймо на язык «недоООП».
Тем не менее на JavaScript можно реализовать и иерархическое наследование. В таких случаях и делают разные обертки для того чтоб не повторять каждый раз одно и тоже. Здесь я поддерживаю предложение синтаксиса классов в ES6.
Лично для меня ES6 классы — это:
1) декларативное описание иерархическое наследование (как у C/C++/Java)
2) унификация обьявления классов (вместо собственного велосипеда)
Для разнообразия попробую и ваш сервис.
Да, размер на самом деле больше. Вы заставили меня задуматся. Правда у меня сейчас не так много шаблонов, что б волноватся за их размер.
Но надо заметить, что часть кода сжимается js минификатором и думаю для одностраничных приложений, где много кода приложения, шаблоны не будут сильно влиять на итоговый размер.
По поводу доступа. Все шаблоны лежат в папке app/templates. В скомпилированом коде это просто javascript функции, которые доступны как CommonJS модули.
Для примера есть шаблон app/templates/main-layout.hbs. В програмном коде пишем:
Простой доступ и никаких глобальных переменных.