Здравствуйте, 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)
Здравствуйте, Mr.Cat, Вы писали:
MC>Здравствуйте, thesz, Вы писали: T>>Наверное, надо показать, что это действительно неактуально. А то поиск туториалов в гугле указывает на обратное. T>>sum пишут как угодно, только не через сравнение с образцом. MC>Может, играет роль то, что матчинга не только нет в стандарте — на него нет srfi. Как известно, любимое занятие схемеров — ходить в лес и по дрова
. MC>Ну и sum — какой-то странный пример. Там не так ярко выражена структурная индукция — ее "перебивают" fold и просто возможность сделать apply к сложению.
Иными словами, схемеры не могут только преподавать программирование через сравнение с образцом.
Заметная часть прогресса в программировании с 1971 года, AFAIR, недоступна.
ЧТД.
T>>match-lambda откуда берётся? Почему match-lambda? Почему не просто match? MC>match-lambda — это match плюс lambda с одним параметром. Берется из plt-шной библиотеки. MC>Мне подумалось, что она из всех plt-шных матчей самая наглядная. Хотя я бы лучше сделал на макросах какой-нить match-define. MC>Если имплементация совсем дремучая — берется match.scm — там все то же самое, но он нерасширяемый и синтаксис слегка отличается.
А если у меня DrScheme? Этот код работать не будет, так?
MC>>>Второе — спорно. В том, что статическая типизация — это хорошо — я согласен. Но не думаю, что она имеет решающее значение в выборе инструмента. T>>Она упрощает обучение. MC>>>Третье — аналогично. Ленивость — это хорошо, не не критично, на мой взгляд. Тем более, такие вещи, как ленивые списки, в схеме тоже можно реализовать. T>>Она упрощает обучение. MC>Вполне возможно, мне не с чем сравнивать, я ФП по хаскелю учил — потом уже познакомился со scheme.
См. аргументы Вадлера.
T>>Попробуй реализовать myif без макросов. MC>А ты попробуй написать функцию mylet.
Где у Вадлера, или в SICP или у тебя присутствует mylet?
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Здравствуйте, thesz, Вы писали: T>Стр. 20. статьи Вадлера. T>head (map sqrt ([1..10] ++ [-1,-2..-10])) для ленивых списков (потоков) Схемы не равно head (map sqrt [1..10] ++ map sqrt [-1,-2..-10]). Во втором случае будет ошибка.
Я вообще не понимаю, к чему Вадлер взялся это писать (я, кстати, уже говорил, что этот пример некорректен). Он в своем примере делит на но^W^W^W описывает поведение гипотетического map, который форсит вычисление всего стрима (в чем сам признается). Вполне очевидно, что map не обязан этого делать. Рекомендую заглянуть в srfi-41.
Здравствуйте, Mr.Cat, Вы писали:
MC>Здравствуйте, thesz, Вы писали: T>>Стр. 20. статьи Вадлера. T>>head (map sqrt ([1..10] ++ [-1,-2..-10])) для ленивых списков (потоков) Схемы не равно head (map sqrt [1..10] ++ map sqrt [-1,-2..-10]). Во втором случае будет ошибка. MC>Я вообще не понимаю, к чему Вадлер взялся это писать (я, кстати, уже говорил, что этот пример некорректен).
Тогда был корректен. N'est-ce pas?
MC>Он в своем примере делит на но^W^W^W описывает поведение гипотетического map, который форсит вычисление всего стрима (в чем сам признается). Вполне очевидно, что map не обязан этого делать. Рекомендую заглянуть в srfi-41. MC>
Здравствуйте, thesz, Вы писали: T>Иными словами, схемеры не могут только преподавать программирование через сравнение с образцом.
Не улавливаю мысли. Ты все еще про то, что мануалы 20-летней давности не упоминают про ПМ?
T>А если у меня DrScheme? Этот код работать не будет, так?
Этот — это какой? Тот, что я привел или match.scm? Впрочем, будет и будет.
DrScheme — это ide, часть проекта plt.
T>См. аргументы Вадлера.
Да видел я. Для меня это просто слова, субъективное мнение Вадлера, с которым я оставляю за собой право не соглашаться. Возможно, надо иметь опыт обучения программированию, чтобы спорить с Вадлером на его уровне. У меня такого опыта нет.
T>>>Попробуй реализовать myif без макросов. MC>>А ты попробуй написать функцию mylet. T>Где у Вадлера, или в SICP или у тебя присутствует mylet?
Тебе нужен пример того, где пригодится самопальная конструкция, осуществляющая биндинг?
Здравствуйте, thesz, Вы писали: MC>>Я вообще не понимаю, к чему Вадлер взялся это писать (я, кстати, уже говорил, что этот пример некорректен). T>Тогда был корректен. N'est-ce pas?
И тогда не был. Вадлер сам признается, что про append и map написал фигню.
T>Это надо быть большим фанатом, чтобы исправлять ошибки в примере, не замечая, что доказываешь существование других ошибок.
Ты про то, что с полиморфизмом в схеме туго? Я этого и не отрицаю — и этой проблеме стоило бы уделить гораздо больше внимания, чем тому о чем говорит Вадлер.
Здравствуйте, Mr.Cat, Вы писали: MC>3. Lazy лучше, чем eager.
Кстати, забавный факт: макросы scheme (емнип, это в r6rs задокументировано) разворачивает в normal order.
Здравствуйте, Mr.Cat, Вы писали:
MC>Здравствуйте, thesz, Вы писали: T>>Иными словами, схемеры не могут только преподавать программирование через сравнение с образцом. MC>Не улавливаю мысли. Ты все еще про то, что мануалы 20-летней давности не упоминают про ПМ?
Я про то, что несмотря на наличия какого-то сравнения с образцом, его не используют при обучении Схеме.
T>>А если у меня DrScheme? Этот код работать не будет, так? MC>Этот — это какой? Тот, что я привел или match.scm? Впрочем, будет и будет. MC>DrScheme — это ide, часть проекта plt.
bigloo, кто там ещё. То, что не имеет отношения к проекту plt.
T>>См. аргументы Вадлера. MC>Да видел я. Для меня это просто слова, субъективное мнение Вадлера, с которым я оставляю за собой право не соглашаться. Возможно, надо иметь опыт обучения программированию, чтобы спорить с Вадлером на его уровне. У меня такого опыта нет.
Перефразируем для понятности.
"Вадлер имеет опыт обучения программированию, я нет. Для того, чтобы спорить с ним, мне надо иметь опыт преподавания программирования, который у него есть, а у меня нет. Поэтому его слова для меня пустой звук."
Великолепно.
T>>>>Попробуй реализовать myif без макросов. MC>>>А ты попробуй написать функцию mylet. T>>Где у Вадлера, или в SICP или у тебя присутствует mylet? MC>Тебе нужен пример того, где пригодится самопальная конструкция, осуществляющая биндинг?
Ну!
Самопальные конструкции управления я использую направо и налево.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Здравствуйте, Mr.Cat, Вы писали:
MC>Здравствуйте, thesz, Вы писали: MC>>>Я вообще не понимаю, к чему Вадлер взялся это писать (я, кстати, уже говорил, что этот пример некорректен). T>>Тогда был корректен. N'est-ce pas? MC>И тогда не был. Вадлер сам признается, что про append и map написал фигню.
Где?
T>>Это надо быть большим фанатом, чтобы исправлять ошибки в примере, не замечая, что доказываешь существование других ошибок. MC>Ты про то, что с полиморфизмом в схеме туго? Я этого и не отрицаю — и этой проблеме стоило бы уделить гораздо больше внимания, чем тому о чем говорит Вадлер.
А он про это и говорит.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Здравствуйте, thesz, Вы писали: T>Я про то, что несмотря на наличия какого-то сравнения с образцом, его не используют при обучении Схеме.
Возожно, в силу своего снобизма, авторы курсов считают, что концепцию — структурную индукцию — можно преподавать и без полновесного матчинга (да хотя бы на cond и предикатах).
Плюс, не стоит говорить за все учебные пособия. Например, в EoPL применяется собственная нотация для atd и несложный матчинг.
T>bigloo, кто там ещё. То, что не имеет отношения к проекту plt.
Там можно использовать match.scm, если сама имплементация не предлагает своих вариантов. Например, в chicken используется тот же самый match.scm, обернутый в chicken-овскую ситему модулей.
T>Перефразируем для понятности.
Нет, не так. "Вадлер местами прав, а местами несет скобкофобский бред. На совсем уж толстые места я могу указать, но есть спорные моменты, в которых он может апеллировать к своему опыту преподавания".
MC>>Тебе нужен пример того, где пригодится самопальная конструкция, осуществляющая биндинг? T>Ну!
Навскидку — если тебе захочется расширить паттерн-матчинг какой-то собственно конструкцией.
(This particular problem would go away if streams were redesigned to delay
evaluation of the head as well as delaying evaluation of the tail. However, the
theorem would still not be true, as can be seen by replacing
(enumerate- i nt erval -42 -7) by (bottom), where evaluation of (bottom)
enters an infinite loop.)
Т.е. с ленивыми списками на самом деле проблем нет. Разве что список настолько ленив, что даже не может определиться, список он (сразу вернуть бесконечный цикл под stream-cons) или нет.
T>А он про это и говорит.
Ну да, целый раздел про несуществующую проблему и один крошечный абзац про существующую.
It is particularly annoying that two very similar types — lists and streams — must be
Philip Wader Why Caicuiating is Better than Scheming 20
treated differently. Thus, one needs sum to find the sum of a list of numbers, and
sum-stream to find the sum of a stream of numbers.
Здравствуйте, Mr.Cat, Вы писали:
MC>Здравствуйте, thesz, Вы писали: T>>Я про то, что несмотря на наличия какого-то сравнения с образцом, его не используют при обучении Схеме. MC>Возожно, в силу своего снобизма, авторы курсов считают, что концепцию — структурную индукцию — можно преподавать и без полновесного матчинга (да хотя бы на cond и предикатах).
И в этом случае переход к зависимым типам будет ещё сложнее, чем сейчас.
MC>Плюс, не стоит говорить за все учебные пособия. Например, в EoPL применяется собственная нотация для atd и несложный матчинг.
EoPL недоступен для ознакомления.
На первой странице гугля при поиске "как написать sum ан схеме" нет ничего про сравнение с образцом.
MIT, тем не менее, молодцы.
T>>bigloo, кто там ещё. То, что не имеет отношения к проекту plt. MC>Там можно использовать match.scm, если сама имплементация не предлагает своих вариантов. Например, в chicken используется тот же самый match.scm, обернутый в chicken-овскую ситему модулей. T>>Перефразируем для понятности. MC>Нет, не так. "Вадлер местами прав, а местами несет скобкофобский бред. На совсем уж толстые места я могу указать, но есть спорные моменты, в которых он может апеллировать к своему опыту преподавания".
Перефразируем: "MrCat старается оскорбить человека, который не в состоянии ему ответить, ассоциируя некое вымышленное психическое заболевание 'скобкофобию' со словами этого человека".
Причём ты перешёл на ad hominem attack чуть ли не во втором ответе.
Это характерно, так сказать.
MC>>>Тебе нужен пример того, где пригодится самопальная конструкция, осуществляющая биндинг? T>>Ну! MC>Навскидку — если тебе захочется расширить паттерн-матчинг какой-то собственно конструкцией.
Приведи пример.
Если он будет из жизни, ещё лучше.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Здравствуйте, Mr.Cat, Вы писали:
MC>Здравствуйте, thesz, Вы писали: T>>Где? MC>
MC>(This particular problem would go away if streams were redesigned to delay
MC>evaluation of the head as well as delaying evaluation of the tail. However, the
MC>theorem would still not be true, as can be seen by replacing
MC>(enumerate- i nt erval -42 -7) by (bottom), where evaluation of (bottom)
MC>enters an infinite loop.)
MC>Т.е. с ленивыми списками на самом деле проблем нет.
На момент написания Вадлером статьи потоки не были спроектированы правильно. А значит, проблемы были.
MC>Разве что список настолько ленив, что даже не может определиться, список он (сразу вернуть бесконечный цикл под stream-cons) или нет.
Моё прочтение отлично от твоего.
Наоборот, ленивый список схемы недостаточно ленив. map f bottom не создаёт отложенного вычисления, а пытается его вычислить.
T>>А он про это и говорит. MC>Ну да, целый раздел про несуществующую проблему и один крошечный абзац про существующую.
Она существовала на тот момент, или ты можешь это опровергнуть?
MC>
MC>It is particularly annoying that two very similar types — lists and streams — must be
MC>Philip Wader Why Caicuiating is Better than Scheming 20
MC>treated differently. Thus, one needs sum to find the sum of a list of numbers, and
MC>sum-stream to find the sum of a stream of numbers.
Это уже следствия из других недостатком схемы.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Здравствуйте, thesz, Вы писали: T>На момент написания Вадлером статьи потоки не были спроектированы правильно. А значит, проблемы были. T>Она существовала на тот момент, или ты можешь это опровергнуть?
Вадлер ссылается на недостаток описанной в sicp реализации, это к языку не относится.
Мне кажется, ты отождествляешь scheme и sicp (местами и Вадлер тоже) — этого не стоит делать.
Здравствуйте, thesz, Вы писали: T>И в этом случае переход к зависимым типам будет ещё сложнее, чем сейчас.
Кто о чем, а ты о зависимых типах. Не знаю, что это такое, но, нет, я не считаю, что это стоит делать на макросах.
T>EoPL недоступен для ознакомления.
Можно украсть
T>Перефразируем
И снова не так.
"Mr.Cat предлагает всем, кто в дискуссии о scheme собирается использовать аргументы о (1)скобках (2)префиксной нотации (3)code as data, external representation и квотировании — сперва пройти курс лечения от скобкофобии, о чем предъявить справку". Вот как-то так.
T>Приведи пример.
Ну возьми любую возможность, которой нет в хаскеле.
Например, как раскрывается ellipsis:
#lang scheme
(match '((1 2) (3 4) (5 6))
((list (list a b) ...) (list a b)))
У Вадлера есть заголовок, навроде "ленивость исключает необходимость в special forms". Ты и в этом с ним согласишься?
Здравствуйте, Mr.Cat, Вы писали:
MC>Здравствуйте, thesz, Вы писали: T>>На момент написания Вадлером статьи потоки не были спроектированы правильно. А значит, проблемы были. T>>Она существовала на тот момент, или ты можешь это опровергнуть? MC>Вадлер ссылается на недостаток описанной в sicp реализации, это к языку не относится. MC>Мне кажется, ты отождествляешь scheme и sicp (местами и Вадлер тоже) — этого не стоит делать.
Так вот, это означает введение ленивых вычислений всюду.
Иными словами, если мы собираемся сделать Схему без проблем, описанных Вадлером, это будет уже совершенно другой язык программирования. С совершенно другой семантикой.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Здравствуйте, Mr.Cat, Вы писали:
MC>Здравствуйте, thesz, Вы писали: T>>И в этом случае переход к зависимым типам будет ещё сложнее, чем сейчас. MC>Кто о чем, а ты о зависимых типах.
Это не только я. Это ещё и вся прогрессивная общественность.
MC>Не знаю, что это такое, но, нет, я не считаю, что это стоит делать на макросах.
В любом случае, мы имеем проблемы с продолжением курса обучения.
T>>EoPL недоступен для ознакомления. MC>Можно украсть
Он не настолько ценен для меня.
T>>Перефразируем MC>И снова не так. MC>"Mr.Cat предлагает всем, кто в дискуссии о scheme собирается использовать аргументы о (1)скобках (2)префиксной нотации (3)code as data, external representation и квотировании — сперва пройти курс лечения от скобкофобии, о чем предъявить справку". Вот как-то так.
Иными словами, ты автоматически присваиваешь любому критикующему синтаксис Схемы/Лисп титул "скобкофоб".
Отличный способ оказывать влияние на людей.
T>>Приведи пример. MC>Ну возьми любую возможность, которой нет в хаскеле.
Мне бы желательно получить осмысленный пример.
MC>Например, как раскрывается ellipsis: MC>
MC>#lang scheme
MC>(match '((1 2) (3 4) (5 6))
MC> ((list (list a b) ...) (list a b)))
Что означает этот отрывок?
MC>У Вадлера есть заголовок, навроде "ленивость исключает необходимость в special forms". Ты и в этом с ним согласишься?
Здравствуйте, thesz, Вы писали: T>В любом случае, мы имеем проблемы с продолжением курса обучения.
Да, тут ты прав. И мне было бы интересно взглянуть на курс, который идет от самых основ программирования до зависимых типов.
T>Иными словами, ты автоматически присваиваешь любому критикующему синтаксис Схемы/Лисп титул "скобкофоб".
Ну да, примерно так.
T>Мне бы желательно получить осмысленный пример. T>Что означает этот отрывок?
Это unzip, встроенный в матчинг. Удобная штука.
T>Special forms T>Да. Частью они внесены в язык в качестве конструкций (definitions, например), частью (значительной) могут быть выражены обычными функциями. T>Conditionals и sequencing (+ assignment) вполне выражаются обычными функциями: myIf и >>= с его коллегой return.
Самая интересный раздел по твоей ссылке — это macros. Какой аналог для explicit renaming в хаскеле?
Здравствуйте, Mr.Cat, Вы писали:
MC>Здравствуйте, thesz, Вы писали: T>>В любом случае, мы имеем проблемы с продолжением курса обучения. MC>Да, тут ты прав. И мне было бы интересно взглянуть на курс, который идет от самых основ программирования до зависимых типов.
Programming in Martin-Lof type theory
T>>Иными словами, ты автоматически присваиваешь любому критикующему синтаксис Схемы/Лисп титул "скобкофоб". MC>Ну да, примерно так.
Хорошо. Тогда я воспользуюсь идеей Грегори Хауса и объявлю любого MrCat, что присваивает титулы "скобкофоб" без всякого внутреннего контроля, идиопом (см. “Cuddy” and “idiop” being the relevant parts of that sentence).
T>>Мне бы желательно получить осмысленный пример. T>>Что означает этот отрывок? MC>Это unzip, встроенный в матчинг. Удобная штука.
Так что он означает, этот отрывок? Чем не удовлетворяет сравнение с головой-парой?
T>>Special forms T>>Да. Частью они внесены в язык в качестве конструкций (definitions, например), частью (значительной) могут быть выражены обычными функциями. T>>Conditionals и sequencing (+ assignment) вполне выражаются обычными функциями: myIf и >>= с его коллегой return. MC>Самая интересный раздел по твоей ссылке — это macros. Какой аналог для explicit renaming в хаскеле?
Это покрывается функциями высших порядков (подстановка аргументов), ленивыми вычислениями (создание замыканий для условий) и областями видимости в виде let/where.
Хотя я могу чего-то недопонимать.
Меня макросы давно не интересуют.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Здравствуйте, geniepro, Вы писали:
G>Здравствуйте, thesz, Вы писали:
T>>EoPL недоступен для ознакомления.
Да плюс на страничке самого EoPL содержание выложено в ps. Это ж вообще, в начале 21-го века, и такой анахронизм.
G>Ежели чуть-чуть поискать, то найти можно...
Дело в том, что Схема не предлагает логику структурирования программы. И ни EoPL, ни SICP не дают сведений о том, как защищаться от неизвестных ранее ошибок.
Поэтому, уж извини, я воздержусь от чтения.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
T>Иными словами, схемеры не могут только преподавать программирование через сравнение с образцом. T>Заметная часть прогресса в программировании с 1971 года, AFAIR, недоступна. T>ЧТД.
Ваш разговор полная бредуха, но тем не менее
* Аргументы Вадлера произвели на американские университеры не особенно сильное впечатление.
* У Фридмана — опыт преподавания скорее даже поболее, чем у Вадлера. Ну и вообше, HTDP, PLAI, EOPL, SICP, The Reasoned Schemer, The Seasoned Schemer
* Все курсы indiana.edu издревле использовали паттерн-матчинг(и дататипы тоже) — раньше хитрый, со встроенным катаморфизмом, последние годы простой, его написал Киселев, вот реализация (портабельная) целиком:
;;; Code written by Oleg Kiselyov
;;; (http://pobox.com/~oleg/ftp/)
;;;
;;; Taken from leanTAP.scm
;;; http://kanren.cvs.sourceforge.net/kanren/kanren/mini/leanTAP.scm?view=log
; A simple linear pattern matcher
; It is efficient (generates code at macro-expansion time) and simple:
; it should work on any R5RS Scheme system.
; (pmatch exp <clause> ...[<else-clause>])
; <clause> ::= (<pattern> <guard> exp ...)
; <else-clause> ::= (else exp ...)
; <guard> ::= boolean exp | ()
; <pattern> :: =
; ,var -- matches always and binds the var
; pattern must be linear! No check is done
; _ -- matches always
; 'exp -- comparison with exp (using equal?)
; exp -- comparison with exp (using equal?)
; (<pattern1> <pattern2> ...) -- matches the list of patterns
; (<pattern1> . <pattern2>) -- ditto
; () -- matches the empty list
(define-syntax pmatch
(syntax-rules ()
((_ exp clause ...)
(let ((val-to-match exp))
(pmatch* val-to-match clause ...)))))
(define match-failure
(lambda (val)
(error 'match-failure "failed match ~s\n" val)))
(define-syntax pmatch*
(syntax-rules (else)
((_ val (else exp ...))
(let () exp ...))
((_ val)
(match-failure val))
((_ val (pattern () exp0 exp ...) . clauses)
(let ((fail (lambda () (pmatch* val . clauses))))
; note that match-pattern may do binding. Here,
; other clauses are outside of these binding
(match-pattern val pattern (let () exp0 exp ...) (fail))))
((_ val (pattern guard exp0 exp ...) . clauses)
(let ((fail (lambda () (pmatch* val . clauses))))
(match-pattern val pattern
(if guard (let () exp0 exp ...) (fail))
(fail))))))
; (match-pattern val pattern kt kf)
(define-syntax match-pattern
(syntax-rules (_ quote unquote)
((_ val _ kt kf) kt)
((_ val () kt kf)
(if (null? val) kt kf))
((_ val (quote lit) kt kf)
(if (equal? val (quote lit)) kt kf))
((_ val (unquote var) kt kf)
(let ((var val)) kt))
((_ val (x . y) kt kf)
(if (pair? val)
(let ((valx (car val))
(valy (cdr val)))
(match-pattern valx x
(match-pattern valy y kt kf)
kf))
kf))
((_ val lit kt kf)
(if (equal? val (quote lit)) kt kf))))
Здравствуйте, thesz, Вы писали: MC>>Это unzip, встроенный в матчинг. Удобная штука. T>Так что он означает, этот отрывок? Чем не удовлетворяет сравнение с головой-парой?
Демонстрирует, как матч биндит первый компонент от unzip-а к "a", а второй — к "b".
MC>>Самая интересный раздел по твоей ссылке — это macros. Какой аналог для explicit renaming в хаскеле? T>Это покрывается функциями высших порядков (подстановка аргументов), ленивыми вычислениями (создание замыканий для условий) и областями видимости в виде let/where.
Не, не покрывается. Например, на syntax-rules, менее мощных, чем er, сделан паттерн матчинг. Ленивость и фвп позволят в хаскеле дополнить матчинг какой-нибудь новой конструкцией?
В принципе, Вадлер тогда был в некотором роде прав. В r3rs не было даже syntax-rules, в sicp макросы вроде тоже не упоминались, так что myif в рамках r3rs написать было нельзя. Хотя, возможно, в реальных имплементациях scheme макросистемы уже были.
Здравствуйте, thesz, Вы писали: T>Да плюс на страничке самого EoPL содержание выложено в ps. Это ж вообще, в начале 21-го века, и такой анахронизм.
Реализация интерпретаторов уже неактуальна?
Здравствуйте, z00n, Вы писали:
Z>Здравствуйте, thesz, Вы писали:
T>>Иными словами, схемеры не могут только преподавать программирование через сравнение с образцом. T>>Заметная часть прогресса в программировании с 1971 года, AFAIR, недоступна. T>>ЧТД. Z>Ваш разговор полная бредуха, но тем не менее Z>* Аргументы Вадлера произвели на американские университеры не особенно сильное впечатление.
Просто тогда нормальной Миранды не было.
Z>* У Фридмана — опыт преподавания скорее даже поболее, чем у Вадлера. Ну и вообше, HTDP, PLAI, EOPL, SICP, The Reasoned Schemer, The Seasoned Schemer
И всё вокруг Схемы. Неинтересно.
Тот же Appel хотя бы для нескольких языков свой Modern Compiler Implementation сделал.
Z>* Все курсы indiana.edu издревле использовали паттерн-матчинг(и дататипы тоже) — раньше хитрый, со встроенным катаморфизмом, последние годы простой, его написал Киселев, вот реализация (портабельная) целиком:
Издревле — это как давно?
Z>Ну и так далее, лень писать.
А зря. Это очень интересно.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Здравствуйте, Mr.Cat, Вы писали:
MC>Здравствуйте, thesz, Вы писали: MC>>>Это unzip, встроенный в матчинг. Удобная штука. T>>Так что он означает, этот отрывок? Чем не удовлетворяет сравнение с головой-парой? MC>Демонстрирует, как матч биндит первый компонент от unzip-а к "a", а второй — к "b".
Что такое первый компонент от unzip-а?
Почему ты не можешь нормально объяснить? Приведи раскрытый код этого сравнения с образцом.
MC>>>Самая интересный раздел по твоей ссылке — это macros. Какой аналог для explicit renaming в хаскеле? T>>Это покрывается функциями высших порядков (подстановка аргументов), ленивыми вычислениями (создание замыканий для условий) и областями видимости в виде let/where. MC>Не, не покрывается. Например, на syntax-rules, менее мощных, чем er, сделан паттерн матчинг. Ленивость и фвп позволят в хаскеле дополнить матчинг какой-нибудь новой конструкцией?
Да зачем?
MC>В принципе, Вадлер тогда был в некотором роде прав. В r3rs не было даже syntax-rules, в sicp макросы вроде тоже не упоминались, так что myif в рамках r3rs написать было нельзя. Хотя, возможно, в реальных имплементациях scheme макросистемы уже были.
Ещё раз. То, что в Схеме требует макросов, в языке типа Хаскеля работает без них.
Так что Вадлер и сейчас прав. Для использования Хаскеля надо меньше изучать.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Здравствуйте, Mr.Cat, Вы писали:
MC>Здравствуйте, thesz, Вы писали: T>>Да плюс на страничке самого EoPL содержание выложено в ps. Это ж вообще, в начале 21-го века, и такой анахронизм. MC>Реализация интерпретаторов уже неактуальна?
Здравствуйте, thesz, Вы писали: MC>>Демонстрирует, как матч биндит первый компонент от unzip-а к "a", а второй — к "b". T>Что такое первый компонент от unzip-а? T>Почему ты не можешь нормально объяснить? Приведи раскрытый код этого сравнения с образцом.
Раскрытый код смотреть неинтересно.
#lang scheme
(match '((1 2) (3 4) (5 6))
((list (list a b) ...) и т.п.
Забиндит '(1 3 5) к "a" и '(2 4 6) к "b". Все, подробнее не буду — слишком много постов на один пример. Если после этого разговора ты заинтересуешься схемой — сам доки почитаешь. Если нет — ну и бог с ним, значит — тебе это не нужно.
T>Да зачем?
Чтобы разговор поддержать. Ну не хочешь — не надо, есть пример нагляднее — см. ниже.
T>Ещё раз. То, что в Схеме требует макросов, в языке типа Хаскеля работает без них.
По данному пункту критики схемы приводят в пример то, что для реализации cond через if нужны макросы. Т.е. задача такова:
Есть полновесная имплементация scheme, но в ней нет cond (другой вариант — if или short-circuit-логические операции). Сделай cond, неотличимый от того, что прописан в стандарте.
Ок. Предлагаю тебе такую задачу:
Есть полновесная имплементация хаскеля но в ней нет let (или where — на твой выбор). Сделай let (ну или where), неотличимый от того, что прописан в репорте.
Instructors who would prefer that their students use a strongly-typed language such as ML or OCAML will find that the algorithms in the book are easy to rewrite in such a language. We have added to Scheme a new special form, define-datatype, that is very similar to ML's datatype or OCAML's type. With the use of our matching form, cases, the programs are structured much as they would be in ML or OCAML.
We rely on a Scheme-based parser generator, SLLGEN. It should be straightforward to port our lexical and grammatical specifications to an ML-based parser generator such as mllex/mlyacc or to ocamllex/ocamlyacc, or to write the parsers by hand
Z>>* Все курсы indiana.edu издревле использовали паттерн-матчинг(и дататипы тоже) — раньше хитрый, со встроенным катаморфизмом, последние годы простой, его написал Киселев, вот реализация (портабельная) целиком:
T>Издревле — это как давно?
Мои раскопки показали, что по крайней мере с 1992 года (первое издание EOPL). Там это называлось "variant-case".
Здравствуйте, thesz, Вы писали: T>Безопасных — актуальна.
Все это, конечно, интересно, но пока не для моего ума.
Я тут-таки намылился (благо начало семестра — есть свободное время) подучить, теорию (в плане ЛИ, типов и т.п.) — хочу начать с "Type Theory & Functional Programming" за авторством Simon Thompson — это хороший вариант?
T>На Схеме — нет.
В EoPL обсуждаются основы. Например, это одно из немногих мест, где доступно объясняется cps-преобразование.
Здравствуйте, Mr.Cat, Вы писали:
MC>Здравствуйте, thesz, Вы писали: MC>>>Демонстрирует, как матч биндит первый компонент от unzip-а к "a", а второй — к "b". T>>Что такое первый компонент от unzip-а? T>>Почему ты не можешь нормально объяснить? Приведи раскрытый код этого сравнения с образцом. MC>Раскрытый код смотреть неинтересно. MC>
MC>#lang scheme
MC>(match '((1 2) (3 4) (5 6))
MC> ((list (list a b) ...) и т.п.
MC>
MC>Забиндит '(1 3 5) к "a" и '(2 4 6) к "b". Все, подробнее не буду — слишком много постов на один пример. Если после этого разговора ты заинтересуешься схемой — сам доки почитаешь. Если нет — ну и бог с ним, значит — тебе это не нужно.
Именно.
Я не вижу, зачем делать unzip через сравнение с образцом, если есть unzip.
T>>Да зачем? MC>Чтобы разговор поддержать. Ну не хочешь — не надо, есть пример нагляднее — см. ниже.
Лично я стараюсь приводить жизненные примеры.
Потому, что так проще пронять.
Что, тяжело привести пример, когда действительно нужно дополнять сравнение с образцом дополнительной конструкцией?
T>>Ещё раз. То, что в Схеме требует макросов, в языке типа Хаскеля работает без них. MC> По данному пункту критики схемы приводят в пример то, что для реализации cond через if нужны макросы. Т.е. задача такова: MC>
MC>Есть полновесная имплементация scheme, но в ней нет cond (другой вариант — if или short-circuit-логические операции). Сделай cond, неотличимый от того, что прописан в стандарте.
MC>Ок. Предлагаю тебе такую задачу: MC>
MC>Есть полновесная имплементация хаскеля но в ней нет let (или where — на твой выбор). Сделай let (ну или where), неотличимый от того, что прописан в репорте.
let x = e in f x это (\x -> f x) e (опустив подробности с взаимно-рекурсивными определениями)
Неотличимо по синтаксису не получится, но по семантике соответствует.
См. lambda lifting в обе стороны.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Здравствуйте, z00n, Вы писали:
Z>Здравствуйте, thesz, Вы писали:
Z>>>* Все курсы indiana.edu издревле использовали паттерн-матчинг(и дататипы тоже) — раньше хитрый, со встроенным катаморфизмом, последние годы простой, его написал Киселев, вот реализация (портабельная) целиком:
T>>Издревле — это как давно?
Z>Мои раскопки показали, что по крайней мере с 1992 года (первое издание EOPL). Там это называлось "variant-case".
То есть, критика Вадлера всё-таки подействовала.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Здравствуйте, Mr.Cat, Вы писали:
MC>Здравствуйте, thesz, Вы писали: T>>Безопасных — актуальна. MC>Все это, конечно, интересно, но пока не для моего ума. MC>Я тут-таки намылился (благо начало семестра — есть свободное время) подучить, теорию (в плане ЛИ, типов и т.п.) — хочу начать с "Type Theory & Functional Programming" за авторством Simon Thompson — это хороший вариант?
Выглядит хорошо. Вроде, покрыты все интересные вещи, и даже с запасом.
Надо будет потом почитать.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Здравствуйте, thesz, Вы писали: T>Я не вижу, зачем делать unzip через сравнение с образцом, если есть unzip.
Это удобно. Собственно, одно из применение макросов — "сделать себе удобно".
T>Что, тяжело привести пример, когда действительно нужно дополнять сравнение с образцом дополнительной конструкцией?
Да, тяжело. Как правило, я макросы использую "по месту" — т.е. вижу, что некоторая конструкция начинает копипаститься — и начинаю думать, как этого избежать. В некоторых случаях в итоге конструкция заменяется макросом. Аналогично — с паттерн-матчингом. Поэтому сформулировать какой-то отдельно стоящий и наглядный случай использования макросов мне сложно.
T>Неотличимо по синтаксису не получится, но по семантике соответствует.
Ну вот. А говоришь: T>То, что в Схеме требует макросов, в языке типа Хаскеля работает без них.
Получается, что в хаскеле без какого-то подобия макросов нельзя вводить новые конструкции, осуществляющие биндинг.
Здравствуйте, thesz, Вы писали:
T>Здравствуйте, Mr.Cat, Вы писали:
MC>>Я тут-таки намылился (благо начало семестра — есть свободное время) подучить, теорию (в плане ЛИ, типов и т.п.) — хочу начать с "Type Theory & Functional Programming" за авторством Simon Thompson — это хороший вариант?
T>Выглядит хорошо. Вроде, покрыты все интересные вещи, и даже с запасом.
T>Надо будет потом почитать.
Здравствуйте, thesz, Вы писали:
MC>>Т.е. с ленивыми списками на самом деле проблем нет.
T>На момент написания Вадлером статьи потоки не были спроектированы правильно. А значит, проблемы были.
Здравствуйте, thesz, Вы писали:
T>>>Издревле — это как давно?
Z>>Мои раскопки показали, что по крайней мере с 1992 года (первое издание EOPL). Там это называлось "variant-case".
T>То есть, критика Вадлера всё-таки подействовала.
В двух словах: они разделили мудрость на две книги: HTDP для первокурсников, посвященную основам и структурированию программ, и PLAI которая больше похожа на SICP: интерпретаторы разных языков, континюейшны etc.
Схема из статьи:
SICP: HTDP:
primality moving circles
interval arithmetic hangman
symbolic differentiation moving shapes
representing sets moving pictures
huffman encoding trees rearranging words
symbolic algebra binary search trees
digital circuits evaluating scheme
more on web pages
evaluating scheme again
moving pictures, again
mathematical examples
Gaussian elimination
normal/applicative order checking (on) queens
strictness/laziness accumulators on trees
non-determinism missionaries and cannibals
logic programming board solitaire
register machines exploring places
compilers moving pictures, a last time
Fig.1. SICP and HTDP exercises
Здравствуйте, Курилка, Вы писали:
К>Здравствуйте, thesz, Вы писали:
T>>Здравствуйте, Mr.Cat, Вы писали:
MC>>>Я тут-таки намылился (благо начало семестра — есть свободное время) подучить, теорию (в плане ЛИ, типов и т.п.) — хочу начать с "Type Theory & Functional Programming" за авторством Simon Thompson — это хороший вариант? T>>Выглядит хорошо. Вроде, покрыты все интересные вещи, и даже с запасом. T>>Надо будет потом почитать. К>Сергей, тебе для размышлений — последняя книжка того же автора
Деньги дерёт.
Кстати, последнюю книгу я читать не буду — ничего интересного нет.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Здравствуйте, Mr.Cat, Вы писали:
MC>Здравствуйте, thesz, Вы писали: T>>Я не вижу, зачем делать unzip через сравнение с образцом, если есть unzip. MC>Это удобно. Собственно, одно из применение макросов — "сделать себе удобно".
Это тогда, когда регулярные средства неудобны, ведь так?
И получается, что то, что в Хаскеле делается системой типов и регулярными средствами, в Схеме с Лиспом делается макросами (Software Transactional Memory, например).
T>>Что, тяжело привести пример, когда действительно нужно дополнять сравнение с образцом дополнительной конструкцией? MC>Да, тяжело. Как правило, я макросы использую "по месту" — т.е. вижу, что некоторая конструкция начинает копипаститься — и начинаю думать, как этого избежать. В некоторых случаях в итоге конструкция заменяется макросом.
ФВП. В Хаскеле они очень дёшевы.
MC>Аналогично — с паттерн-матчингом. Поэтому сформулировать какой-то отдельно стоящий и наглядный случай использования макросов мне сложно.
T>>Неотличимо по синтаксису не получится, но по семантике соответствует. MC>Ну вот. А говоришь:
Я, опять же, не вижу здесь серьёзных трудностей.
Покажи, пожалуйста, жизненный пример, в котором потребуется вводить связывающие конструкции, не выражаемые через сравнение с образцом, лямбды, ФВП и let/where.
T>>То, что в Схеме требует макросов, в языке типа Хаскеля работает без них. MC>Получается, что в хаскеле без какого-то подобия макросов нельзя вводить новые конструкции, осуществляющие биндинг.
Да.
Да только я всего один раз ощутил нужду в Template Haskell. Недавно.
За почти 11 лет использования Хаскеля.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Уважаемые коллеги, предлагаю по возможности не пренебрегать таким замечательным средством художественной выразительности, как заголовки сообщений. Это существенно упростило бы навигацию и поиск нужных сообщений в дереве комментариев.
Здравствуйте, thesz, Вы писали: T>И получается, что то, что в Хаскеле делается системой типов и регулярными средствами, в Схеме с Лиспом делается макросами
В некоторых случаях — да (канонический случай с myif). Но в обратную сторону неверно.
T>(Software Transactional Memory, например).
А зачем для stm макросы?
T>Покажи, пожалуйста, жизненный пример, в котором потребуется вводить связывающие конструкции, не выражаемые через сравнение с образцом, лямбды, ФВП и let/where.
Я уже предлагал — дополнить паттерн-матчинг новой конструкцией. Пример с (list (pattern) ...) тебе не нравится почему-то, хотя штука удобная. Можно придумать другой — например, сделать матчинг по типу того, как в эрланге сделан для binary. Или чтобы можно было матчить строчку по регулярному выражению и биндить именованные группы к переменным.
T>Да только я всего один раз ощутил нужду в Template Haskell. Недавно.
Ну вот видишь, и ты не безнадежен
Здравствуйте, Mr.Cat, Вы писали:
MC>Здравствуйте, thesz, Вы писали: T>>И получается, что то, что в Хаскеле делается системой типов и регулярными средствами, в Схеме с Лиспом делается макросами MC>В некоторых случаях — да (канонический случай с myif). Но в обратную сторону неверно.
Я не понял, что означает здесь "в обратную сторону".
T>>(Software Transactional Memory, например). MC>А зачем для stm макросы?
Для контроля.
Чтобы ты не потребовал transaction-peek вне atomic block.
Как в Схеме сделать так, чтобы транзакционные примитивы не могли быть вызваны вне атомарного блока?
T>>Покажи, пожалуйста, жизненный пример, в котором потребуется вводить связывающие конструкции, не выражаемые через сравнение с образцом, лямбды, ФВП и let/where. MC>Я уже предлагал — дополнить паттерн-матчинг новой конструкцией. Пример с (list (pattern) ...) тебе не нравится почему-то, хотя штука удобная. Можно придумать другой — например, сделать матчинг по типу того, как в эрланге сделан для binary. Или чтобы можно было матчить строчку по регулярному выражению и биндить именованные группы к переменным.
Ну, вот binary уже туда-сюда.
Строка по регулярным выражениям — это комбинаторы в сочетании с rewrite rules.
T>>Да только я всего один раз ощутил нужду в Template Haskell. Недавно. MC>Ну вот видишь, и ты не безнадежен
И это, я считаю, самый большой недостаток Хаскеля — то, что мне TH все-таки понадобился.
Это очень, очень неудобно.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Здравствуйте, thesz, Вы писали: T>Чтобы ты не потребовал transaction-peek вне atomic block. T>Как в Схеме сделать так, чтобы транзакционные примитивы не могли быть вызваны вне атомарного блока?
Ты про монаду STM? Да, мне тоже нравится идея контролировать все, что можно, в компайл-тайм на уровне типов, но scheme — динамически типизированный язык со всеми вытекающими.
T>rewrite rules.
Которые, судя по описанию (сам не юзал), близки к syntax-rules.
Вот увидишь, пройдет немного времени (лет 5?) — и хаскелисты будут знакомиться с макросами чуть ли не раньше, чем с монадой ЙО.
Здравствуйте, Mr.Cat, Вы писали:
MC>Здравствуйте, thesz, Вы писали: T>>Чтобы ты не потребовал transaction-peek вне atomic block. T>>Как в Схеме сделать так, чтобы транзакционные примитивы не могли быть вызваны вне атомарного блока? MC>Ты про монаду STM? Да, мне тоже нравится идея контролировать все, что можно, в компайл-тайм на уровне типов, но scheme — динамически типизированный язык со всеми вытекающими.
То-то и оно.
Схема никак не помогает не совершать ошибок.
T>>rewrite rules. MC>Которые, судя по описанию (сам не юзал), близки к syntax-rules.
Нет, не близки.
MC>Вот увидишь, пройдет немного времени (лет 5?) — и хаскелисты будут знакомиться с макросами чуть ли не раньше, чем с монадой ЙО.
Нет, не будут.
rewrite rules нужны для оптимизации чего-то там. Оптимизация возникает тогда, когда сама программа уже написана.
Ты как-то всё не поймёшь, что макросы и метапрограммирование нужно тогда, когда язык сам по себе низкоуровневый. См. того же Брукса, "Мифический человеко-месяц".
Здравствуйте, thesz, Вы писали: T>Схема никак не помогает не совершать ошибок.
По сравнению с хаскелем — да. По сравнению с другими динамическими языками — иногда помогает.
MC>>Вот увидишь, пройдет немного времени (лет 5?) — и хаскелисты будут знакомиться с макросами чуть ли не раньше, чем с монадой ЙО. T>Нет, не будут.
Ну по крайней мере я буду на это надеяться
T>rewrite rules нужны для оптимизации чего-то там.
Подожди. Ты только что собирался их применять совсем не для оптимизации.
T>Ты как-то всё не поймёшь, что макросы и метапрограммирование нужно тогда, когда язык сам по себе низкоуровневый.
Ну в целом да. Это преподносится как достоинство схемы: небольшое ядро плюс всемогущие макросы. Ты зачем-то разделяешь понятия, для разделения не предназначенные: тебе видится убогий язык и макросы, исправляющие его убогость. А scheme — это на самом деле красивый язык с макросами.
T>См. того же Брукса, "Мифический человеко-месяц".
Там и про это есть? Возможно, и правда полистать стоит.
Здравствуйте, Mr.Cat, Вы писали:
MC>Здравствуйте, thesz, Вы писали: T>>rewrite rules нужны для оптимизации чего-то там. MC>Подожди. Ты только что собирался их применять совсем не для оптимизации.
Макрос сделает статический код, выполняющийся эффективно. Rewrite rules нужны для того же.
То есть, для оптимизации.
T>>Ты как-то всё не поймёшь, что макросы и метапрограммирование нужно тогда, когда язык сам по себе низкоуровневый. MC>Ну в целом да. Это преподносится как достоинство схемы: небольшое ядро плюс всемогущие макросы.
Какие же они всемогущие, если даже не могут проверить обращение к транзакции вне блока работы с транзакцией?
MC>Ты зачем-то разделяешь понятия, для разделения не предназначенные: тебе видится убогий язык и макросы, исправляющие его убогость. А scheme — это на самом деле красивый язык с макросами.
Да я как-то красоты в языке не вижу.
Как только показывают что-то красивое, так оказывается, что это макросы. Посмотришь внимательней внутрь, так и красоты нет — один синтаксис.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Здравствуйте, thesz, Вы писали: T>>>rewrite rules нужны для оптимизации чего-то там. MC>>Подожди. Ты только что собирался их применять совсем не для оптимизации. T>Макрос сделает статический код, выполняющийся эффективно. Rewrite rules нужны для того же. T>То есть, для оптимизации.
Стоп. Ты говорил собрался сделать, что rr позволят позволить писать вот вот такое (я это имел в виду под паттерн-матчингом к регекспу):
f "^\\d+$" = doSomething1
f "^\\w+$" = doSomething2
Все-таки это можно и без rr сделать?
T>Как только показывают что-то красивое, так оказывается, что это макросы.
Таки ты макроненавистник
Здравствуйте, Mr.Cat, Вы писали:
MC>Здравствуйте, thesz, Вы писали: T>>>>rewrite rules нужны для оптимизации чего-то там. MC>>>Подожди. Ты только что собирался их применять совсем не для оптимизации. T>>Макрос сделает статический код, выполняющийся эффективно. Rewrite rules нужны для того же. T>>То есть, для оптимизации. MC>Стоп. Ты говорил собрался сделать, что rr позволят позволить писать вот вот такое (я это имел в виду под паттерн-матчингом к регекспу): MC>
{-# LANGUAGE ViewPatterns, PatternGuards #-}data Match = M [String] | F -- match or failure.type REString = String
re :: REString -> String -> Match
re re string = M [re,string] -- должно быть что-то из regexp, что в ghc
f (re "something" -> M []) = "do something"-- try f "really nothing".
f (re "nothing" -> M ["nothing","really nothing"]) = "do nothing"
f _ = "huh?"-- Второй вариант:
g string
| M [] <- re "something" = "do something"
| m ["nothing","really nothing"] <- re "nothing" = "do nothing"
| _ = "huh?"
Вот кусок реального кода:
getPart (ValueArr arr) ((Right index):path)
| Just value <- lookup index arr = getPart value path
| otherwise = dummyValue
При сравнении можно получать значения переменных.
T>>Как только показывают что-то красивое, так оказывается, что это макросы. MC>Таки ты макроненавистник
Мне они не нравятся с практической точки зрения.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Здравствуйте, thesz, Вы писали: T>{-# LANGUAGE ViewPatterns, PatternGuards #-}
Вот-вот. Нет бы развивать макросы в хаскеле — вместо этого плодят расширения.
Здравствуйте, Mr.Cat, Вы писали:
MC>Стоп. Ты говорил собрался сделать, что rr позволят позволить писать вот вот такое (я это имел в виду под паттерн-матчингом к регекспу): MC>
Здравствуйте, Mr.Cat, Вы писали:
MC>Здравствуйте, thesz, Вы писали: T>>{-# LANGUAGE ViewPatterns, PatternGuards #-} MC>Вот-вот. Нет бы развивать макросы в хаскеле — вместо этого плодят расширения.
И как ты себе это представляешь, расширение Хаскеля макросами?
Попробуй спроектировать макросистему, чтобы на ней можно было сделать (хотя бы) PatternGuards/ViewPatterns. С учётом строгой типизации и сообщений об ошибках.
Так что вот так-то вот так.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Здравствуйте, thesz, Вы писали: T>Попробуй спроектировать макросистему, чтобы на ней можно было сделать (хотя бы) PatternGuards/ViewPatterns. С учётом строгой типизации и сообщений об ошибках.
В ближайшее время и пробовать не буду. Но у plt есть typed scheme — надо будет посмотреть, как там дела с макросами.
Здравствуйте, Mr.Cat, Вы писали:
MC>Здравствуйте, thesz, Вы писали: T>>Попробуй спроектировать макросистему, чтобы на ней можно было сделать (хотя бы) PatternGuards/ViewPatterns. С учётом строгой типизации и сообщений об ошибках. MC>В ближайшее время и пробовать не буду. Но у plt есть typed scheme — надо будет посмотреть, как там дела с макросами.
* type errors in SML are difficult
* type errors in Soft Scheme are pure torture
* explaining type errors in Soft Scheme remains for PhD-level experts
Вот так-то.
Ещё добавь вывод типов, а не просто проверку, и тебе станет совсем хорошо.
А в Typed Scheme-то, как раз, от вывода типов ушли. И про макросы ни слова. Так что ничем тебе typed scheme не поможет.
PS
Smith's Law: Any sufficiently large test suite for a program written in a dynamic language will contain an ad-hoc, informally-specified, bug-ridden, slow, patchy implementation of half of the Haskell type system
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)