Re[14]: Длинная нудная статья, почему не Scheme
От: z00n  
Дата: 06.10.09 17:45
Оценка: 7 (2) :)
Здравствуйте, thesz, Вы писали:


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))))


Ну и так далее, лень писать.
Re[22]: Длинная нудная статья, почему не Scheme
От: Mr.Cat  
Дата: 06.10.09 17:52
Оценка:
Здравствуйте, thesz, Вы писали:
MC>>Это unzip, встроенный в матчинг. Удобная штука.
T>Так что он означает, этот отрывок? Чем не удовлетворяет сравнение с головой-парой?
Демонстрирует, как матч биндит первый компонент от unzip-а к "a", а второй — к "b".

MC>>Самая интересный раздел по твоей ссылке — это macros. Какой аналог для explicit renaming в хаскеле?

T>Это покрывается функциями высших порядков (подстановка аргументов), ленивыми вычислениями (создание замыканий для условий) и областями видимости в виде let/where.
Не, не покрывается. Например, на syntax-rules, менее мощных, чем er, сделан паттерн матчинг. Ленивость и фвп позволят в хаскеле дополнить матчинг какой-нибудь новой конструкцией?
В принципе, Вадлер тогда был в некотором роде прав. В r3rs не было даже syntax-rules, в sicp макросы вроде тоже не упоминались, так что myif в рамках r3rs написать было нельзя. Хотя, возможно, в реальных имплементациях scheme макросистемы уже были.
Re[20]: Длинная нудная статья, почему не Scheme
От: Mr.Cat  
Дата: 06.10.09 18:00
Оценка:
Здравствуйте, thesz, Вы писали:
T>Да плюс на страничке самого EoPL содержание выложено в ps. Это ж вообще, в начале 21-го века, и такой анахронизм.
Реализация интерпретаторов уже неактуальна?
Re[15]: Длинная нудная статья, почему не Scheme
От: thesz Россия http://thesz.livejournal.com
Дата: 06.10.09 18:10
Оценка:
Здравствуйте, 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)
Re[23]: Длинная нудная статья, почему не Scheme
От: thesz Россия http://thesz.livejournal.com
Дата: 06.10.09 18:12
Оценка:
Здравствуйте, 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)
Re[21]: Длинная нудная статья, почему не Scheme
От: thesz Россия http://thesz.livejournal.com
Дата: 06.10.09 18:13
Оценка:
Здравствуйте, Mr.Cat, Вы писали:

MC>Здравствуйте, thesz, Вы писали:

T>>Да плюс на страничке самого EoPL содержание выложено в ps. Это ж вообще, в начале 21-го века, и такой анахронизм.
MC>Реализация интерпретаторов уже неактуальна?

Безопасных — актуальна. На Схеме — нет.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[24]: Длинная нудная статья, почему не Scheme
От: Mr.Cat  
Дата: 06.10.09 19:33
Оценка:
Здравствуйте, 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), неотличимый от того, что прописан в репорте.

Re[16]: Длинная нудная статья, почему не Scheme
От: z00n  
Дата: 06.10.09 19:40
Оценка:
Здравствуйте, thesz, Вы писали:

T>Тот же Appel хотя бы для нескольких языков свой Modern Compiler Implementation сделал.

http://www.cs.indiana.edu/eopl/MLblurb.html

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".
Re[22]: Длинная нудная статья, почему не Scheme
От: Mr.Cat  
Дата: 06.10.09 19:44
Оценка:
Здравствуйте, thesz, Вы писали:
T>Безопасных — актуальна.
Все это, конечно, интересно, но пока не для моего ума.
Я тут-таки намылился (благо начало семестра — есть свободное время) подучить, теорию (в плане ЛИ, типов и т.п.) — хочу начать с "Type Theory & Functional Programming" за авторством Simon Thompson — это хороший вариант?

T>На Схеме — нет.

В EoPL обсуждаются основы. Например, это одно из немногих мест, где доступно объясняется cps-преобразование.
Re[25]: Длинная нудная статья, почему не Scheme
От: thesz Россия http://thesz.livejournal.com
Дата: 06.10.09 20:47
Оценка:
Здравствуйте, 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)
Re[17]: Длинная нудная статья, почему не Scheme
От: thesz Россия http://thesz.livejournal.com
Дата: 06.10.09 20:58
Оценка:
Здравствуйте, z00n, Вы писали:

Z>Здравствуйте, thesz, Вы писали:


Z>>>* Все курсы indiana.edu издревле использовали паттерн-матчинг(и дататипы тоже) — раньше хитрый, со встроенным катаморфизмом, последние годы простой, его написал Киселев, вот реализация (портабельная) целиком:


T>>Издревле — это как давно?


Z>Мои раскопки показали, что по крайней мере с 1992 года (первое издание EOPL). Там это называлось "variant-case".


То есть, критика Вадлера всё-таки подействовала.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[23]: Длинная нудная статья, почему не Scheme
От: thesz Россия http://thesz.livejournal.com
Дата: 06.10.09 21:00
Оценка: 6 (1)
Здравствуйте, Mr.Cat, Вы писали:

MC>Здравствуйте, thesz, Вы писали:

T>>Безопасных — актуальна.
MC>Все это, конечно, интересно, но пока не для моего ума.
MC>Я тут-таки намылился (благо начало семестра — есть свободное время) подучить, теорию (в плане ЛИ, типов и т.п.) — хочу начать с "Type Theory & Functional Programming" за авторством Simon Thompson — это хороший вариант?

Выглядит хорошо. Вроде, покрыты все интересные вещи, и даже с запасом.

Надо будет потом почитать.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[26]: Длинная нудная статья, почему не Scheme
От: Mr.Cat  
Дата: 06.10.09 21:06
Оценка:
Здравствуйте, thesz, Вы писали:
T>Я не вижу, зачем делать unzip через сравнение с образцом, если есть unzip.
Это удобно. Собственно, одно из применение макросов — "сделать себе удобно".

T>Что, тяжело привести пример, когда действительно нужно дополнять сравнение с образцом дополнительной конструкцией?

Да, тяжело. Как правило, я макросы использую "по месту" — т.е. вижу, что некоторая конструкция начинает копипаститься — и начинаю думать, как этого избежать. В некоторых случаях в итоге конструкция заменяется макросом. Аналогично — с паттерн-матчингом. Поэтому сформулировать какой-то отдельно стоящий и наглядный случай использования макросов мне сложно.

T>Неотличимо по синтаксису не получится, но по семантике соответствует.

Ну вот. А говоришь:
T>То, что в Схеме требует макросов, в языке типа Хаскеля работает без них.
Получается, что в хаскеле без какого-то подобия макросов нельзя вводить новые конструкции, осуществляющие биндинг.
Re[24]: Длинная нудная статья, почему не Scheme
От: Курилка Россия http://kirya.narod.ru/
Дата: 06.10.09 21:15
Оценка:
Здравствуйте, thesz, Вы писали:

T>Здравствуйте, Mr.Cat, Вы писали:


MC>>Я тут-таки намылился (благо начало семестра — есть свободное время) подучить, теорию (в плане ЛИ, типов и т.п.) — хочу начать с "Type Theory & Functional Programming" за авторством Simon Thompson — это хороший вариант?


T>Выглядит хорошо. Вроде, покрыты все интересные вещи, и даже с запасом.


T>Надо будет потом почитать.


Сергей, тебе для размышлений — последняя книжка того же автора
Re[20]: Длинная нудная статья, почему не Scheme
От: z00n  
Дата: 06.10.09 22:25
Оценка: 6 (1)
Здравствуйте, thesz, Вы писали:

MC>>Т.е. с ленивыми списками на самом деле проблем нет.


T>На момент написания Вадлером статьи потоки не были спроектированы правильно. А значит, проблемы были.


Самое смешное — Вадлер в 98-ом сам же и решил задачу, которую придумал:
How to add laziness to a strict language, without even being odd
Re[18]: Длинная нудная статья, почему не Scheme
От: z00n  
Дата: 06.10.09 23:47
Оценка: 30 (4)
Здравствуйте, thesz, Вы писали:

T>>>Издревле — это как давно?


Z>>Мои раскопки показали, что по крайней мере с 1992 года (первое издание EOPL). Там это называлось "variant-case".


T>То есть, критика Вадлера всё-таки подействовала.


Что касается критики SICP применительно к обучению первокурсников — Вадлер был не одинок. Проект PLT Scheme был создан из-за этого, вот их меморандум :
The Structure and Interpretation of the Computer Science Curriculum

В двух словах: они разделили мудрость на две книги: 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


Ну и для полноты картины Haskell:
The Risks and Benefits of Teaching Purely Functional Programming in First Year (PS!)
Re[25]: Длинная нудная статья, почему не Scheme
От: thesz Россия http://thesz.livejournal.com
Дата: 07.10.09 08:55
Оценка: :)
Здравствуйте, Курилка, Вы писали:

К>Здравствуйте, thesz, Вы писали:


T>>Здравствуйте, Mr.Cat, Вы писали:


MC>>>Я тут-таки намылился (благо начало семестра — есть свободное время) подучить, теорию (в плане ЛИ, типов и т.п.) — хочу начать с "Type Theory & Functional Programming" за авторством Simon Thompson — это хороший вариант?

T>>Выглядит хорошо. Вроде, покрыты все интересные вещи, и даже с запасом.
T>>Надо будет потом почитать.
К>Сергей, тебе для размышлений — последняя книжка того же автора

Деньги дерёт.

Кстати, последнюю книгу я читать не буду — ничего интересного нет.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[27]: Длинная нудная статья, почему не Scheme
От: thesz Россия http://thesz.livejournal.com
Дата: 07.10.09 09:11
Оценка:
Здравствуйте, 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)
Re[28]: Заголовки сообщений
От: Qbit86 Кипр
Дата: 07.10.09 09:20
Оценка: +1
To all:

Уважаемые коллеги, предлагаю по возможности не пренебрегать таким замечательным средством художественной выразительности, как заголовки сообщений. Это существенно упростило бы навигацию и поиск нужных сообщений в дереве комментариев.
Глаза у меня добрые, но рубашка — смирительная!
Re[28]: Длинная нудная статья, почему не Scheme
От: Mr.Cat  
Дата: 07.10.09 18:34
Оценка:
Здравствуйте, thesz, Вы писали:
T>И получается, что то, что в Хаскеле делается системой типов и регулярными средствами, в Схеме с Лиспом делается макросами
В некоторых случаях — да (канонический случай с myif). Но в обратную сторону неверно.

T>(Software Transactional Memory, например).

А зачем для stm макросы?

T>Покажи, пожалуйста, жизненный пример, в котором потребуется вводить связывающие конструкции, не выражаемые через сравнение с образцом, лямбды, ФВП и let/where.

Я уже предлагал — дополнить паттерн-матчинг новой конструкцией. Пример с (list (pattern) ...) тебе не нравится почему-то, хотя штука удобная. Можно придумать другой — например, сделать матчинг по типу того, как в эрланге сделан для binary. Или чтобы можно было матчить строчку по регулярному выражению и биндить именованные группы к переменным.

T>Да только я всего один раз ощутил нужду в Template Haskell. Недавно.

Ну вот видишь, и ты не безнадежен
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.