Здравствуйте, thesz, Вы писали: T>Why evaluation is betteer than scheming.
Статьи любителей хаскеля (ну миранды в данном случае — не суть) про лисп и статьи любителей лиспа про хаскель (ну вот, например: http://www.lisperati.com/landoflisp/ — хотя это не совсем статья) очень похожи. А тут еще и 20 лет прошло с момента написания.
Здравствуйте, Mr.Cat, Вы писали:
MC>Здравствуйте, thesz, Вы писали: T>>Why evaluation is betteer than scheming. MC>Статьи любителей хаскеля (ну миранды в данном случае — не суть) про лисп и статьи любителей лиспа про хаскель (ну вот, например: http://www.lisperati.com/landoflisp/ — хотя это не совсем статья) очень похожи. А тут еще и 20 лет прошло с момента написания.
Да, сравнить статью Вадлера с критикой SICP/Scheme в качестве инструмента обучения с landoflisp — это мощно.
Мне даже дополнить нечем, настолько всё прозрачно.
PS
За прошедшие 20 лет Scheme изменился не очень сильно. Сравни с Мирандой.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Здравствуйте, thesz, Вы писали: T>Да, сравнить статью Вадлера с критикой SICP/Scheme в качестве инструмента обучения с landoflisp — это мощно. T>Мне даже дополнить нечем, настолько всё прозрачно.
Там критика того же порядка, что и критика хаскеля в land of lisp. Прямо сейчас у меня нет возможности детально ответить, но неправда начинается с первых же тезисов.
T>За прошедшие 20 лет Scheme изменился не очень сильно. Сравни с Мирандой.
Во-первых, сравни r3rs и r6rs. Во-вторых, это только ядро языка. В scheme не так много фич имеет смысл тянуть в стандарт — очень многое реализуется отдельными библиотеками.
Здравствуйте, Mr.Cat, Вы писали:
MC>Здравствуйте, thesz, Вы писали: T>>Да, сравнить статью Вадлера с критикой SICP/Scheme в качестве инструмента обучения с landoflisp — это мощно. T>>Мне даже дополнить нечем, настолько всё прозрачно. MC>Там критика того же порядка, что и критика хаскеля в land of lisp. Прямо сейчас у меня нет возможности детально ответить, но неправда начинается с первых же тезисов.
Да ты что!
Неправда, что streams и списки в Scheme различны?
Неправда, что сравнения с образцом в Scheme нет?
Неправда, что сравнение с образцом — более понятная запись?
Неправда, что раскрытие выражений со списками должно использовать цитирование списков?
"- Не советую. Съедят." (C) ПНВС
T>>За прошедшие 20 лет Scheme изменился не очень сильно. Сравни с Мирандой. MC>Во-первых, сравни r3rs и r6rs. Во-вторых, это только ядро языка. В scheme не так много фич имеет смысл тянуть в стандарт — очень многое реализуется отдельными библиотеками.
О том и речь.
Сравнение с образцом есть, но оно в библиотеке. Типы есть, но они в библиотеке. Ленивые списки есть, но они в библиотеке и несовместимы с обычными.
Это и есть критика: в ядре языка слишком мало того, что необходимо для обучения без вникания в технические детали.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Здравствуйте, thesz, Вы писали: T>Неправда, что streams и списки в Scheme различны?
Различны. В scheme плохо с полиморфизмом — это я согласен. Только это не такая большая проблема.
T>Неправда, что сравнения с образцом в Scheme нет?
Неправда
T>Неправда, что сравнение с образцом — более понятная запись?
Более понятная, чем что?
T>Неправда, что раскрытие выражений со списками должно использовать цитирование списков?
Пропустил это место. Можно страничку?
T>"- Не советую. Съедят." (C) ПНВС
Ну пусть попробуют
T>Сравнение с образцом есть, но оно в библиотеке. Типы есть, но они в библиотеке. Ленивые списки есть, но они в библиотеке и несовместимы с обычными.
Ты говоришь так, как будто это что-то плохое.
T>Это и есть критика: в ядре языка слишком мало того, что необходимо для обучения без вникания в технические детали.
Какие еще технические детали? Как подключить библиотеку? Это критичная техническая деталь?
Здравствуйте, Mr.Cat, Вы писали: T>>Это и есть критика: в ядре языка слишком мало того, что необходимо для обучения без вникания в технические детали. MC>Какие еще технические детали? Как подключить библиотеку? Это критичная техническая деталь?
PS: В plt вроде библиотеку с матчингом подключать не нужно — все доступно сразу. Хотя не помню точно.
Здравствуйте, Mr.Cat, Вы писали:
MC>Здравствуйте, thesz, Вы писали: T>>Неправда, что streams и списки в Scheme различны? MC>Различны. В scheme плохо с полиморфизмом — это я согласен. Только это не такая большая проблема.
Это отсекает целый класс элегантных решений. Backward state propagation, например, при анализе текстов. А так — да, не проблема.
T>>Неправда, что сравнения с образцом в Scheme нет? MC>Неправда
Напиши, пожалуйста, sum со сравнением с образцом.
T>>Неправда, что сравнение с образцом — более понятная запись? MC>Более понятная, чем что?
Чем рекурсивная запись с явными селекторами или предикатами.
T>>Неправда, что раскрытие выражений со списками должно использовать цитирование списков? MC>Пропустил это место. Можно страничку?
Стр. 9, Confusion between program and data.
И ранее там тоже есть. Например, алгебраические свойства append лучше выглядят, когда он инфиксный.
T>>"- Не советую. Съедят." (C) ПНВС MC>Ну пусть попробуют
Да всё уж, съели. Достаточно того, что ты толком-то статью не прочитал. И рьяно бросился сравнивать её с landoflisp.
T>>Сравнение с образцом есть, но оно в библиотеке. Типы есть, но они в библиотеке. Ленивые списки есть, но они в библиотеке и несовместимы с обычными. MC>Ты говоришь так, как будто это что-то плохое.
Да, это плохо.
Например, ты всегда сможешь сделать unsafeCoerce в обход системы типов и это никак не будет выражено в программе.
"Здесь играем, а здесь я рыбу заворачивал" (С) известно, кто.
Используя Qi, один товарищ сказал, что смог доказать, что 42 — это строка. Это в <lj user=ru_lisp> было.
Вот он, результат системы типов в виде библиотеки.
T>>Это и есть критика: в ядре языка слишком мало того, что необходимо для обучения без вникания в технические детали. MC>Какие еще технические детали? Как подключить библиотеку? Это критичная техническая деталь?
И это тоже.
Читай внимательней, что я могу сказать.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Здравствуйте, thesz, Вы писали: MC>>Различны. В scheme плохо с полиморфизмом — это я согласен. Только это не такая большая проблема. T>Это отсекает целый класс элегантных решений. Backward state propagation, например, при анализе текстов. А так — да, не проблема.
Не знаком с предметной областью, но видится мне, что ты преувеличиваешь.
T>>>Неправда, что сравнения с образцом в Scheme нет? MC>>Неправда T>Напиши, пожалуйста, sum со сравнением с образцом.
Код — вечером. Пока поброди здесь.
T>>>Неправда, что сравнение с образцом — более понятная запись? MC>>Более понятная, чем что? T>Чем рекурсивная запись с явными селекторами или предикатами.
Ну замечатьльно. А при чем тут scheme?
T>Confusion between program and data.
Раздел состоит из какого-то скобкофобского бреда.
T>Например, алгебраические свойства append лучше выглядят, когда он инфиксный.
Что значит лучше выглядят? С эстетической точки зрения?
И если ты про append со страницы 20 — там навскидку некорректный пример.
T>Например, ты всегда сможешь сделать unsafeCoerce в обход системы типов и это никак не будет выражено в программе. T>Используя Qi, один товарищ сказал, что смог доказать, что 42 — это строка. Это в <lj user=ru_lisp> было. T>Вот он, результат системы типов в виде библиотеки.
А система типов тут каким боком возникла?
MC>>Какие еще технические детали? Как подключить библиотеку? Это критичная техническая деталь? T>И это тоже.
T>Читай внимательней, что я могу сказать.
Говорю же, прочитаю внимательнее, но потом.
Здравствуйте, MasterZiv, Вы писали:
MZ>thesz пишет:
>> Да ты что!
MZ>Вот я начинаю понимать, почему лисперы ещё не победили в MZ>мировом масштабе. Разобщены, потому что.
А главное, нет системы типов, что структурировала бы мышление.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Здравствуйте, Mr.Cat, Вы писали:
MC>Здравствуйте, thesz, Вы писали: MC>>>Различны. В scheme плохо с полиморфизмом — это я согласен. Только это не такая большая проблема. T>>Это отсекает целый класс элегантных решений. Backward state propagation, например, при анализе текстов. А так — да, не проблема. MC>Не знаком с предметной областью, но видится мне, что ты преувеличиваешь.
The essence of functional programming, "Variation Six: Variation six: Backwards state".
T>>>>Неправда, что сравнения с образцом в Scheme нет? MC>>>Неправда T>>Напиши, пожалуйста, sum со сравнением с образцом. MC>Код — вечером. Пока поброди здесь.
Там не видно, как написать рекурсивный sum, и будет ли рекурсия с match хвостовой.
И то, что ты затрудняешься написать столь простой код, говорит само за себя.
T>>>>Неправда, что сравнение с образцом — более понятная запись? MC>>>Более понятная, чем что? T>>Чем рекурсивная запись с явными селекторами или предикатами. MC>Ну замечатьльно. А при чем тут scheme?
Это всё проблемы языка, если ты ещё не понял, что объясняют вот так некрасиво.
T>>Confusion between program and data. MC>Раздел состоит из какого-то скобкофобского бреда.
Замечательный аргумент.
T>>Например, алгебраические свойства append лучше выглядят, когда он инфиксный. MC>Что значит лучше выглядят? С эстетической точки зрения?
С "понимательской".
MC>И если ты про append со страницы 20 — там навскидку некорректный пример.
Нет, я про append и ++ со страницы 8 (AFAIR).
T>>Например, ты всегда сможешь сделать unsafeCoerce в обход системы типов и это никак не будет выражено в программе. T>>Используя Qi, один товарищ сказал, что смог доказать, что 42 — это строка. Это в <lj user=ru_lisp> было. T>>Вот он, результат системы типов в виде библиотеки. MC>А система типов тут каким боком возникла?
Не кто иной, как ты спросил у меня, считаю ли я плохим то, что система типов не в языке, а в библиотеке.
Я привёл пример, почему система типов в библиотеке хуже, чем в языке.
MC>>>Какие еще технические детали? Как подключить библиотеку? Это критичная техническая деталь? T>>И это тоже. T>>Читай внимательней, что я могу сказать. MC>Говорю же, прочитаю внимательнее, но потом.
Вот тогда и поговорим.
Пока же ты съеден чуть более, чем полностью.
И уже наполовину переварен.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Здравствуйте, thesz, Вы писали: T>и будет ли рекурсия с match хвостовой.
Будет
T>При том, что в SICP объясняется так, а не иначе. T>Это всё проблемы языка, если ты ещё не понял, что объясняют вот так некрасиво. T>Там не видно, как написать рекурсивный sum
Там описывается паттерн матчинг. Чтобы написать sum, надо включить моск. Или ты намекаешь, что некто, изучающий scheme по книгам 20-летней давности не найдет ничего про паттерн матчинг (например) и научится плохому? Да ради бога.
T>>>Confusion between program and data. MC>>Раздел состоит из какого-то скобкофобского бреда. T>Замечательный аргумент.
В ответ на замечательный аргумент "мне ваш синтаксис сложно понимать".
T>>>Например, алгебраические свойства append лучше выглядят, когда он инфиксный. MC>>Что значит лучше выглядят? С эстетической точки зрения? T>С "понимательской".
Ну я про то и говорю. В действии — скобкофобская мантра — "не понимаю я ваши скобки/префиксную нотацию/квотирование/etc.".
MC>>И если ты про append со страницы 20 — там навскидку некорректный пример. T>Нет, я про append и ++ со страницы 8 (AFAIR).
Не нашел. Там вот про это?
map f (xs ++ ys) = map f xs ++ map f ys
T>Не кто иной, как ты спросил у меня, считаю ли я плохим то, что система типов не в языке, а в библиотеке.
Нет, про систему типов речи не шло. Речь шла о паттерн матчинге. Идея приклеивать систему типов сбоку на макросах мне самому не нравится.
Здравствуйте, thesz, Вы писали: MC>>Говорю же, прочитаю внимательнее, но потом. T>Вот тогда и поговорим.
Прочитиал. Критика лиспа сводится к следующим пунктам (в контексте обучения программированию):
1. Нет паттерн-матчинга и пользовательских типов данных.
2. Статическая типизация лучше динамической.
3. Lazy лучше, чем eager.
4. Плохой синтаксис by design.
Первое неактуально.
Второе — спорно. В том, что статическая типизация — это хорошо — я согласен. Но не думаю, что она имеет решающее значение в выборе инструмента.
Третье — аналогично. Ленивость — это хорошо, не не критично, на мой взгляд. Тем более, такие вещи, как ленивые списки, в схеме тоже можно реализовать.
С четвертым согласиться не могу.
Кстати, обещанный нехвостовой sum на матчинге:
(define sum (match-lambda
((list) 0)
((list h t ...) (+ h (sum t)))))
Здравствуйте, Mr.Cat, Вы писали:
MC>Здравствуйте, thesz, Вы писали: MC>>>Говорю же, прочитаю внимательнее, но потом. T>>Вот тогда и поговорим. MC>Прочитиал. Критика лиспа сводится к следующим пунктам (в контексте обучения программированию): MC>1. Нет паттерн-матчинга и пользовательских типов данных. MC>2. Статическая типизация лучше динамической. MC>3. Lazy лучше, чем eager. MC>4. Плохой синтаксис by design. MC>Первое неактуально.
Наверное, надо показать, что это действительно неактуально. А то поиск туториалов в гугле указывает на обратное.
sum пишут как угодно, только не через сравнение с образцом.
MC>Второе — спорно. В том, что статическая типизация — это хорошо — я согласен. Но не думаю, что она имеет решающее значение в выборе инструмента.
Она упрощает обучение.
MC>Третье — аналогично. Ленивость — это хорошо, не не критично, на мой взгляд. Тем более, такие вещи, как ленивые списки, в схеме тоже можно реализовать.
Она упрощает обучение.
Попробуй реализовать myif без макросов.
MC>С четвертым согласиться не могу.
Это уже дело вкуса, согласен.
MC>Кстати, обещанный нехвостовой sum на матчинге: MC>
MC>(define sum (match-lambda
MC> ((list) 0)
MC> ((list h t ...) (+ h (sum t)))))
MC>
match-lambda откуда берётся? Почему match-lambda? Почему не просто match?
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Здравствуйте, thesz, Вы писали: T>Наверное, надо показать, что это действительно неактуально. А то поиск туториалов в гугле указывает на обратное. T>sum пишут как угодно, только не через сравнение с образцом.
Может, играет роль то, что матчинга не только нет в стандарте — на него нет srfi. Как известно, любимое занятие схемеров — ходить в лес и по дрова
.
Ну и sum — какой-то странный пример. Там не так ярко выражена структурная индукция — ее "перебивают" fold и просто возможность сделать apply к сложению.
T>match-lambda откуда берётся? Почему match-lambda? Почему не просто match?
match-lambda — это match плюс lambda с одним параметром. Берется из plt-шной библиотеки.
Мне подумалось, что она из всех plt-шных матчей самая наглядная. Хотя я бы лучше сделал на макросах какой-нить match-define.
Если имплементация совсем дремучая — берется match.scm — там все то же самое, но он нерасширяемый и синтаксис слегка отличается.
MC>>Второе — спорно. В том, что статическая типизация — это хорошо — я согласен. Но не думаю, что она имеет решающее значение в выборе инструмента. T>Она упрощает обучение. MC>>Третье — аналогично. Ленивость — это хорошо, не не критично, на мой взгляд. Тем более, такие вещи, как ленивые списки, в схеме тоже можно реализовать. T>Она упрощает обучение.
Вполне возможно, мне не с чем сравнивать, я ФП по хаскелю учил — потом уже познакомился со scheme.
T>Попробуй реализовать myif без макросов.
А ты попробуй написать функцию mylet.
Re[12]: Длинная нудная статья, почему не Scheme
От:
Аноним
Дата:
06.10.09 02:56
Оценка:
T>sum пишут как угодно, только не через сравнение с образцом.
А зачем писать sum именно через сравнение с образцом?
MC>>Второе — спорно. В том, что статическая типизация — это хорошо — я согласен. Но не думаю, что она имеет решающее значение в выборе инструмента. T>Она упрощает обучение.
Для меня это не очевидно. Можешь обосновать?
MC>>Третье — аналогично. Ленивость — это хорошо, не не критично, на мой взгляд. Тем более, такие вещи, как ленивые списки, в схеме тоже можно реализовать. T>Она упрощает обучение.
Здравствуйте, Аноним, Вы писали:
T>>sum пишут как угодно, только не через сравнение с образцом. А>А зачем писать sum именно через сравнение с образцом?
Потому, что это понятней. См. статью Вадлера выше.
Сравнение с образцом великая сила. Что самое интересное, впервые она появилась в Лиспе, будучи внесена туда отцом Конора МакБрайда (см. Dependently Typed Programs and their Proofs). Теперь, почему-то, лисперы этого чураются, говоря "а зачем оно нам нужно".
MC>>>Второе — спорно. В том, что статическая типизация — это хорошо — я согласен. Но не думаю, что она имеет решающее значение в выборе инструмента. T>>Она упрощает обучение. А>Для меня это не очевидно. Можешь обосновать?
См. статью Вадлера.
При манипуляции кодом, как данными, она разграничивает код (который надо цитировать) и данные (которые не надо). Например.
MC>>>Третье — аналогично. Ленивость — это хорошо, не не критично, на мой взгляд. Тем более, такие вещи, как ленивые списки, в схеме тоже можно реализовать. T>>Она упрощает обучение. А>Тоже неочевидно.
Стр. 20. статьи Вадлера.
head (map sqrt ([1..10] ++ [-1,-2..-10])) для ленивых списков (потоков) Схемы не равно head (map sqrt [1..10] ++ map sqrt [-1,-2..-10]). Во втором случае будет ошибка.
Как на Схеме создать myIf
myIf :: Bool -> a -> a -> a
myIf True thenA elseA = thenA
myIf False thenA elseA = elseA
Без дополнительных сущностей типа макросов?
И вообще, прежде, чем задавать вопросы мне, ответь, пожалуйста, на критику Вадлера в статье выше.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)