to post messages and comments.

Делаю упражнения из SICP — все-таки синтаксис не кажется офигенно удобным, писать еще норм (спасибо, DrRacket, за посветку скобочек), а вот читать крайне тяжело. Это лечится?

Что лучше использовать для выполнения упражнений из SICP? Scheme, которая используется в книге, но трудно гуглится (допускаю, что гугл кривой) или racket/haskell/anything else? Именно в плане понимания концепций.

sicpebook.wordpress.com . Там sicp, в котором не только шрифты и формулы улучшены кем-то старательно, еще и самое главное — сноски показываются на той же странице, где они поставлены (т.к. на той пдф, что я читал до этого, они были простынёй в конце главы).

А теперь прояснили про "каналы" (они же генераторы в питонах, но как и всё остальное — проще и понятнее описано), а заодно фибоначчи на них переписали screencloud.net

Мелочь, но мощная.

Правда, очень не понравилось, что они слегка "слукавили", т.к. в предыдущей же главе использовали некоторые мистические функции (get!) и (set!) для динамической диспетчерезации типов (type-tags), а в этой главе говорят "вызов любой функции до этого зависил только от её аргументов" и "для вычисления функции можно было использовать метод подстановки". ага, щас.

сегодня на канал в ирке зашел чувак, которого я уже и забыл, если честно. И тут сразу:
<shogun_assassin> waterlaz: i took your advice seriously: oi42.tinypic.com 8)
Да он не только правильные книги читает, у него еще и клава механическая!!!

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

Учил её Scheme. За три часа успел дойти до концепта анонимных функций — говорит, вроде кое-что даже начала понимать. Я щитаю, это вин.

Exercise 2.6. In case representing pairs as procedures wasn't mind-boggling enough, consider that, in a
language that can manipulate procedures, we can get by without numbers (at least insofar as nonnegative
integers are concerned) by implementing 0 and the operation of adding 1 as
(define zero (lambda (f) (lambda (x) x)))
(define (add-1 n)
  (lambda (f) (lambda (x) (f ((n f) x)))))
This representation is known as Church numerals, after its inventor, Alonzo Church, the logician who
invented the calculus.
Define one and two directly (not in terms of zero and add-1). (Hint: Use substitution to evaluate
(add-1 zero)). Give a direct definition of the addition procedure + (not in terms of repeated
application of add-1).


Для ленивых вот ответ:

(define zero (lambda (f) (lambda (x) x)))
(define one  (lambda (f) (lambda (x) (f x))))
(define two  (lambda (f) (lambda (x) (f (f x)))))

Сволочи. Они взяли и реализовали cons/car/cdr через замыкания. То есть я и сам мог это сделать, а не догадался.

(define (cons x y)
  (define (dispatch m)
    (cond ((= m 0) x)
          ((= m 1) y)
          (else (error "Argument not 0 or 1 -- CONS" m))))
  dispatch)
(define (car z) (z 0))
(define (cdr z) (z 1))

(EQL "декларативное знание" функция), (EQL "императивное знание" процедура). Когда в инсте давали паскаль такого не объясняли, хотя может Вирт и вводил их не в таком смысле. Но различие четкое есть: описательная часть(пример: математическая функция) и алгоритмическое решение. Хотя не исключаю непонимание со своей стороны.

1.17 и 1.18 в 1.17 нету проверки на 0, ну и хуй с ней.

(define (double a) (+ a a))
(define (halve a) (/ a 2))

(define (* a b)
(if (= b 1)
a
(if (even? b)
(double (* a (halve b)))
(+ a (* a (- b 1))))))

(define (even? a)
(= 0 (remainder a 2)))


1.18:

(define (double a) (+ a a))
(define (halve a) (/ a 2))

(define (* a b)
(*-i 0 a b))

(define (*-i s a b)
(cond ((= b 0) s)
((even? b) (*-i s (double a) (halve b)))
(else (*-i (+ s a) a (- b 1)))))

(define (even? a)
(= 0 (remainder a 2)))

сделал 1.16. пришлось подумать, но осилил. Мой код полностью совпал с тем, что я потом нагуглил для проверки (за исключением названия функций):

(define (p-i b n)
  (p-iter 1 b n))

(define (p-iter a b n)
  (if (= n 0)
    a
    (if (even? n)
      (p-iter a (* b b) (/ n 2))
      (p-iter (* a b) b (- n 1)))))

(define (even? a)
  (= 0 (remainder a 2)))

говно: mit-scheme не умеет readline искаропки

Был в волшебном городе Желтые Воды, там же немного удалось sicp почитать (совсем чуть-чуть, страничек 40). Очень круто. Рекурсию уже изучили, области видимости и прочий scoping изучили, вместе с ним и замыкания, порядки вычисления ленивые/неленивые изучили, рекурсию изучили, причем и рекурсивный и нерекурсивный метод вычисления факториала реализуется через вызов самого себя, а потому лучше чувствуется разница между ними.

Ни циклов ни mutable-переменных не было. И да, schema — гениальный выбор. Язык учить практически не надо, ума не приложу сколько мусора пришлось бы объяснять, взяли бы они питон джаву или что-то еще.

Упражнение 1.4.
Заметим, что наша модель вычислений разрешает существование комбинаций, операторы кото-
рых — составные выражения. С помощью этого наблюдения опишите, как работает следующая
процедура:
(define (a-plus-abs-b a b)
((if (> b 0) + -) a b))

Паскаль служит для по-
строения пирамид — впечатляющих, захватывающих статических структур, создаваемых
армиями, которые укладывают на места тяжелые плиты. При помощи Лиспа порождают-
ся организмы — впечатляющие, захватывающие динамические структуры, создаваемые
командами, которые собирают их из мерцающих мириад более простых организмов.

"Мне кажется, чрезвычайно важно, чтобы мы, занимаясь информатикой, получали радость от общения с компьютером. С самого начала это было громадным удовольствием. Конечно, время от времени встревали заказчики, и через какое-то время мы стали серьезно относиться к их жалобам. Нам стало казаться, что мы вправду отвечаем за то, чтобы эти машины использовались успешно и безошибочно. Я не думаю, что это так. Я считаю, что мы отвечаем за то, что их тренировать, указывать им новые направления и поддерживать уют в доме. Я надеюсь, информатика никогда не перестанет быть радостью. Я надеюсь, что мы не превратимся в миссионеров. Не надо чувствовать себя продавцом Библии. Таких в мире и так достаточно. То, что вы знаете о программировании, могут выучить и другие. Не думайте, что в ваших руках ключ к успешной работе с комьютерами. Что у вас, как я думаю и надеюсь, есть — это разум: способность увидеть в машине больше, чем вы видели, когда вас впервые к ней подвели, увидеть, что вы способны сделать ее большим." Алан. Дж. Перлис (1 апреля 1922 — 7 февраля 1990)

Оставил на ЛОРе коммент, вынесу-ка сюда, а то вдруг там потрут, а я так старался писать, что было бы обидно:
linux.org.ru

----------------------------------
И вообще, вы тут все долбанулись?
Какие груви? Бля, студентам надо в башку вдолбить что такое программирование вообще, на чем оно основано, и какие принципы надо соблюдать при написании кода. Заценивать ваши ебнутые моднявые хипстерские недоязычки им не просто не надо, а просто вредно блять.

И какие Си? Си блять вообще нельзя давать студентам, они от этого свихиваются и становятся полоумными ебанько, неспособными понять лямбды и замыкания.

Надо начинать с SICP или подобной книжки, в которой объясняется устройство и работа компьютера, и виды абстрагирования от низкоуровневых вычислительных машин.
А язык брать самый простой но в то же время высокоуровневый. Вот схемка — идеальный вариант. Сейчас в западных вузах еще можен пидон, но я эту тенденцию не одобряю, т.к. выбор пидона супротив схемок это просто хайп и посему плохо.
----------------------------------

Еще немного про SICP.

Читать конкретно SICP, конечно же, совершенно необязательно.
Вполне можно и самому дойти и до всех концепций, описанных там, и до других концепций, которые на них основаны.

Но бля, без SICP вероятность остаться тупым необразованным хуйлом, всю жизнь пишущим говнокод на жабке или сишечке, и гыгыкающим над словосочетаниями "абстракция" и "регистро-стековая машина" — гораздо выше.

Некто ztarlitz с яндекс видео начал переводить видеозаписи лекций по SICP. Субтитрами.
Вот первая из 20 лекций: video.yandex.ru
Там же можно найти еще две.
Еще у того же пользователя есть несколько переведенных лекций Фейнмана.