LINUX.ORG.RU

SICP, теперь и на JavaScript

 ,


3

2

Избранные главы уникального учебника по начальному обучению программированию теперь доступны в виде интерактивного курса прямо в вашем браузере.

Любая часть кода из материалов курса теперь выполняется по клику мыши, что придает чтению учебного материала динамику и наглядность.

>>> Подробности

anonymous

Проверено: Shaman007 ()
Последнее исправление: Shaman007 (всего исправлений: 2)

Ответ на: комментарий от Virus

К лингвисту, регистрантик.

По сабжу: предчувствую лютый бугурт у лисперов и функциональщиков.

А страница с книгой то ли тормозит, то ли просто странно себя ведет.

buddhist ★★★★★
()
Ответ на: комментарий от buddhist

бугурта не будет. хотя бы по той причине, что код все-равно написан в функциональной манере. sicp ценен на схемой, а идеями.

function pair(x,y) {
   function dispatch(m) {
      if (m === 0) return x;
      else if (m === 1) return y;
      else error("Argument not 0 or 1 -- pair ",m);
   }
   return dispatch;
}
function head(z) {
   return z(0);
}
function tail(z) {
   return z(1);
}
rikardoac
()
Ответ на: комментарий от ZuBB

а как этот кусок кода должен работать?

Ну, типа возвращается т.н. замыкание: функция которая обращается к данным за пределами своего объявления (моё ламерское объяснение). В данном случае эта штука тупо аналог вот такого словаря:

{0:x,
 1:y}

Ну или массива [x,y]. Зачем такое понадобилось без контекста не понятно.

true_admin ★★★★★
()
Ответ на: комментарий от rikardoac

этоя знаю. мне непонятно почему он об этом так высказался

ZuBB ★★★★★
()
Ответ на: комментарий от true_admin

Зачем такое понадобилось без контекста не понятно.

В исходном SICP были примеры реализации cons, car и cdr.

PolarFox ★★★★★
()
Ответ на: комментарий от PolarFox

В исходном SICP были примеры реализации cons, car и cdr.

Я не читал оригинала, так что поправьте меня если ошибаюсь. В лиспе всё есть список. В js тоже есть списки и они уже поддерживают многие операции. Почему бы их не использовать? Или это недостаточно функционально выходит?

В общем, не хотелось бы чтобы люди учились программировать на js таким вот образом :).

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

не часто но, случается. все зависит от твоего codestyle. А в его рамках ошибки делаются как раз довольно редко. Вот если миксовать...

ZuBB ★★★★★
()
Ответ на: комментарий от ZuBB
var x = pair('car', 'cdr')

// => function dispatch(m) {
//      if (m === 0) return x;
//      else if (m === 1) return y;
//      else error("Argument not 0 or 1 -- pair ",m);
//   }
head(x)
// => "car"
tail(x)
// => "cdr"
rikardoac
()
Ответ на: комментарий от true_admin

Я уже не помню точного контекста, вроде говорилось что в общем-то если у нас есть функции, то список можно реализовать с их помощью. В sicp для многих встроенных в scheme фич даются реализации на основе более фундаментальных фич.

PolarFox ★★★★★
()
Последнее исправление: PolarFox (всего исправлений: 1)
Ответ на: комментарий от ZuBB

а пример?

???

l = [1,2,3,4]
l[0] // head
l[1:] // tail
l + l // concatenation

Есть, правда один момент: некоторые алгоритмы подразумевают мутабельные списки, а некоторые иммутабельные. Правда, что там в лиспе я не знаю.

true_admin ★★★★★
()

Вообще на JS переписывать мало смысла. В нём хотя бы оптимизация хвостовых вызовов появилась?

PolarFox ★★★★★
()
Ответ на: комментарий от buddhist

предчувствую лютый бугурт у лисперов и функциональщиков.

Дык жабаскрипт — это и есть недолишп для неосиливших.

gensym ★★
()
Ответ на: комментарий от ZuBB

это не сработает так как ты думаешь

Вот поэтому я хочу чтобы те кто сделают машину времени вернулись в прошлое и замочили создателей js :(

true_admin ★★★★★
()
Ответ на: комментарий от gensym

Какой тонкий вброс. Я не думаю что его слова надо воспринимать буквально. Моя интерпретация: речь шла о простоте и лёгкости обучения.

true_admin ★★★★★
()

Интересно конечно, но вот только так на javascript никто не пишет. Особенно в части обработки списков, просто бессмысленно это. Взяли и перевели со схемы один в один. Хорошо бы книгу в подобном ключе, но учитывающую специфику и лучшие практики JS. Вот как Higher Order Perl.

Hjorn
()
Ответ на: комментарий от true_admin

Ну, типа возвращается т.н. замыкание: функция которая обращается к данным за пределами своего объявления (моё ламерское объяснение).

Дело не только в том, что функция обращается к данным из контекстов выше, а в том, что она может сделать это позже, когда стека с этими данными уже не будет, поэтому компилятору нужно обеспечить им жизнь более долгую, чем жизнь их стека.

Bohtvaroh ★★★★
()
Ответ на: комментарий от true_admin

Я не думаю что его слова надо воспринимать буквально.

именно что буквально: «Scheme was the bait I went for in joining Netscape.»

Моя интерпретация: речь шла о простоте и лёгкости обучения.

лажа, на это там даже намёка нет

lazyklimm ★★★★★
()
Ответ на: комментарий от true_admin

Согласен, смотрится непривычно и лепоато.

deterok ★★★★★
()
Ответ на: комментарий от true_admin

Почему бы их не использовать?

А на кой тогда такой JS нужен, когда есть Scheme?

anonymous
()

Посмотрел книгу. Ну что сказать? Половины книги нет. Книга заканчивается на «Combining Data of Different Types», а дальше все. Ужасно неудобно читать книгу у них на сайте, видимо захотели выпендриться и все сделать на JS, в том числе и оглавление. Каждое слово, один в один, ничего не переделывали из оригинала, только исходники. Похоже на то, что на реализацию метациклического интерпретатора у низ мозгов не хватило, так как СИКП, до 3 главы сможет освоить даже школьник.

shamkir
()
Ответ на: комментарий от rikardoac

Полностью с вами согласен. Это не учебник по сновам Scheme, а учебник по программированию в целом.

shamkir
()
Ответ на: комментарий от true_admin

Я не читал оригинала, так что поправьте меня если ошибаюсь. В лиспе всё есть список. В js тоже есть списки и они уже поддерживают многие операции. Почему бы их не использовать? Или это недостаточно функционально выходит?

В оригинале это был как раз пример реализации структуры данный «список» с помощью замыканий.

В общем, не хотелось бы чтобы люди учились программировать на js таким вот образом :).

А это явно не книга по изучению Javascript.

жесть

Enjoy your Javascript. Хотя лучше использовать Coffeescript, в нём «==» и «is» — alias'ы для «===», да и язык поприятнее.

theNamelessOne ★★★★★
()
Ответ на: комментарий от alienclaster

Не совсем так - скорее, в лиспе все *выглядит* как список.

Верно, только выглядит. А на деле список построен из пар.

anonymous
()
Ответ на: комментарий от true_admin

Я не читал оригинала, так что поправьте меня если ошибаюсь. В лиспе всё есть список.

Нет. В лиспе далеко не всё - список.

rtvd ★★★★★
()
Ответ на: комментарий от gensym

Дык жабаскрипт — это и есть недолишп для неосиливших.

...который работает на почти каждом компьютере. В отличии от Common LISP и прочих.

rtvd ★★★★★
()
Ответ на: комментарий от true_admin

Очевидно что pair, head и tail это реализация списка.

loz ★★★★★
()
Ответ на: комментарий от gensym

Так вроде любой язык это недолисп для неосиливших, вон лиспы уже захватывают всякие *vm, только для штангистов еще ничего нет.

loz ★★★★★
()
Ответ на: комментарий от gensym

В JavaScript есть:

1) Человеческий синтаксис

2) Разделение на statements и expressions

3) ООП из коробки

4) Встроенные в язык регулярные выражения

5) Встроенные в язык hash maps

Ничего этого нет и быть не может в этих ваших лишпиках. И кто тут теперь «недо-»?

anonymous
()
Ответ на: комментарий от rikardoac
function pair(x,y) {
   function dispatch(m) {
      if (m === 0) return x;
      else if (m === 1) return y;
      else error("Argument not 0 or 1 -- pair ",m);
   }
   return dispatch;
}
function head(z) {
   return z(0);
}
function tail(z) {
   return z(1);
}

А чем их не устроил оригинальный вариант? Типа

function pair(x, y) {
   return function p(f) {
      return f(x, y);
   };
}
function head(p) {
   return p(function(x, y) {
      return x;
   });
}
function tail(p) {
   return p(function(x, y) {
      return y;
   });
}
korvin_ ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.