Perl как учебный язык в СШ -- ваше мнение?

sany79

Почтенные господа! Хотел бы увидеть мнения о пригодности Перла как языка для обучения программированию школьников с середины 9 класса до середины 11.
Имею скромный, но, кажется, успешный трёхлетний опыт преподавания информатики в обычной СШ. Дети приходят в 9 класс с совершенно различными начальными навыками программирования. Нужно начинать с самого начала -- с Hello, world. В учебном плане -- 2 часа в неделю. Один семестр из 4х зарезервирован для общих вопросов, и, по заданию руководства, для поверхностного изучения ТеХа.
Один мой знакомый считает, что Перл спрсобствует хамскому стилю программирования, когда пишутся нечитаемые программы. Поэтому мой выбор остановился на Перле после некоторых колебаний. К тому же отец окружной методист выражал недоумение по поводу такого выбора (хотя, кажется, имел смутное представление об этом языке).
Отдаю себе отчёт в том, что при обучении на Перле за кадром остаются многие интересные вещи вроде динамической памяти или хитрожопых алгоритмов сортировки. Но зато приятно, когда можно написать короткую и содержательную программу, не заботясь о компиляции и других не имеющих прямого отношения к делу вещах.
Только прошу высказываться по существу, а не устраивать Священную Войну, и не смеяца надо мной, и не писать: какой ламер, госссссподи!

avinir60

ИМХО, самый лучший язык для обучения - Паскаль.

sany79

С Паскалем проблема. Линукс. К тому же что такое Паскаль? Разве есть стандарт Паскаля? Может и есть, но он убогий какой-то. Язык Ершова тоже не катит -- алг-нач-кон. И ещё подчёркиваю -- 2 часа в неделю, 3 семестра, и на практику, и на теорию. Хочется изучение языка как такового проделать быстрее, чтобы больше времени уделить решению задач. К тому же это школьники, и не всем программирование так уж интересно. Интерес удаётся поддерживать, когда получаются самодельные программы, короткие и достаточно эффективные. Типа конвеевсой жизни на консоли. Дети в восторге -- они это написали сами, в каких-то 100 строчек!

hoha32

Kylix - a-la Delphi. Правда, я не знаю насколько он работоспособен.
А под линух ИМХО самое логичное - C.

sany79

Я думал, конечно, о C. Но C, кажется, менее лаконичен, раз этак в 10 иногда. К тому же компиляция и сборка -- лишний наворот. А учить писать программы, не разбивая их на модули не есть хорошо.
И ещё: регулярные выражения. С ними в C хлопотно.

a10063

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

ma3yp

Второй год учу школьников программированию. В Линуксе.
Язык долго не выбирал - Питон однозначно!
Перл однозначно не катит. Перл - это особо извращенный стиль программирования.

avinir60

Если так нравится Перл - подумай о ПХП. По возможностям примерно то же, а код выглядит гораздо лаконичнее.

Dasar

Если под Линукс, то тогда Java.
ps
Почитай здесь: http://rsdn.ru/Forum/Message.aspx?mid=331183. Была довольно интересная дисскусия.

Dasar

Еще в плане обучения, что-то хорошее про python говорили.

Chupa

> самый лучший язык для обучения
Для обучения чему?
ИМХО, для начала лучше что-нибудь функциональное, например, haskell или lisp.
А уже потом переходить к императивным языкам.

Marinavo_0507

садист
на Java даже hello world чтобы написать, нужно несколько строчек странных конструкций
а ведь дети спросят, что они делают
можно посмотреть на scheme, есть и курс готовый: http://mitpress.mit.edu/sicp/full-text/book/book.html
хотя конечно СШ и MIT - разные вещи
более простой язык найти трудно будет имхо

Dasar

Имхо, функциональные языки сложны для начального понимания.
И на них сложнее сделать что-то реальное (полезную программку какую-нибудь, игрушку, например).

Dasar

Быстрее всего народ осваивает Дельфи, щелкая красивые кнопочки, и разбираясь что получилось.

ma3yp

Питон имеет весьма лаконичный код, во многом похож на Бейсик и C.
Имеет реализации под Windows и Macintosh
Ну в каком еще языке вы запишите алгоритм Евклида в две строчки:


a=input("")
b=input("")
while a>0:
(a,b)=(b%a,a)
print b


Главная изюминка питона - выделение блока не при помощи скобок {} или Begin..End, а величиной отступа текста от начала строки. То есть красиво отформатированный текст в питоне - это не роскошь, а требование языка.

Ivan8209

http://dmoz.org/Computers/Programming/Languages/Pascal/GNU_Pascal/
Перл не надо.
Это очень плохой стиль.
Лучше не использовать ничего Си-подобного вообще.
Обязательно алгоритмический язык?
Или можно привлечь что-то ещё?
---
...Я работаю антинаучным аферистом...

sany79

Класс задач не совсем устоялся. К тому же выбор задач зависит от "уровня" класса (раз на раз не приходится) и от уровня учеников -- стараюсь давать задачи для небольших групп человек по 5.
Примерно так:
Hello, world!
Таблица умножения.
Квадратное уравнение.
Числа Фибонначи.
Факторизация целых чисел и НОД.
Поиск простых чисел.
Факториал (рекурсивный).
Подсчёт количества символов, слов и строк в файле.
Простейший find/ls.
По выбору:
Игрушки: Жизнь, тетрис, морской бой, питон и т. п. на базе Term::ReadKey или Curses.
Статистическое распознавание языка/кодировки текста в файле.
Кодирование/декодирование при помощи xor.
Простейшее декодирование при помощи частотного анализа.
Морфологический аанлиз русских слов путём получения различных словоформ и проверки их на ispell.
Работа с базами данных.
CGI.
Решение некоторые из задач не удалось довести до завершения, но небесполезная работа тем не менее была проделана.

Marinavo_0507

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

ma3yp

Я думал о том, чтобы использовать Схему. Взял руководство по Схеме и начал читать.
Дошел до циклов. Десять минут медитировал над страницей, но так и не понял, как же там циклы делаются. Возможно у меня было плохое руководство. Но скорее всего я слишком привык к процедурным языкам, чтобы воспринимать что-либо лиспоподобное. Но ведь я не смогу учить школьников тому, в чем сам разбираюсь плохо? К тому же процедурное программирование им все-таки в будущем больше пригодится.

Dasar

Хочешь сказать, что когда щелкаем красивые кнопочки - это еще не программирование?

Ivan8209

> Имхо, функциональные языки сложны для начального понимания.
Ой, вот этого не надо.
Выражения записываются куда проще, чем для алгоритмических.
И твой алгоритм Евклида пишется в одну строку.
> И на них сложнее сделать что-то реальное
> (полезную программку какую-нибудь, игрушку, например).
Я бы не сказал.
Языки что ML-, что Лисп-семейств очень удобны.
Логические задачи решаются на них на ура.
Численные тоже.
Одна динамическая память со сбором мусора чего стоит.
---
...Я работаю антинаучным аферистом...

Chupa

А что здесь программа?
Последовательность кликов?
Если её можно будет сохранить и прогнать через интерпретатор, тогда да.

Ivan8209

В Лиспе циклы делаются через хвостовую рекурсию.
Тем более в Схеме.
---
...Я работаю антинаучным аферистом...

TYU_2008

я бы посоветовал либо python, либо ruby, но никак не перл. на перле очень легко писать плохо

sany79

>можно посмотреть на scheme
Не такой уж он и простой. Для меня как минимум. Написал сам факториал на scheme -- чуть мозги не выкипели

Dasar

я не понял вопрос.
ps
ты на дельфи когда-нибудь писал?

Marinavo_0507

> Хочешь сказать, что когда щелкаем красивые кнопочки - это еще не программирование?
Зависит.
Дельфи я видел давно (версия 3 тогда надо было писать код, чтобы получилась программа, реализующая
что-то, кроме показа окошек.
Сейчас там можно одними щёлканиями это делать?

Ivan8209

Хм.
На таких задачках и Форт пойдёт на ура.
---
...Я работаю антинаучным аферистом...

Ivan8209

?
Чего там сложного?
(define (fact n) (if (= n 0) 1 (* n (fact (- n 1
---
...Я работаю антинаучным аферистом...

eduard615

Имхо, надо точно определить, каковы задачи курса.
вообще перл язык для гурманов -- как правило для каждой локальной задачи есть много путей решения при отсутсвии классического пути. непонятность -- это конечно бред, который идет от незнания базовых вещей, главная проблема -- сокрытие важных вещей, например, высокоуровневые обертки с одинаковой семантикой для различных вещей (open оценка эффективности различных конструкций, которые делают одно и то же. что бы писать на перле красивый и быстрый код надо очень хорошо представлять работу интерпретатора и для этого нужен опыт. главный вопрос: сможете ли вы за изысками языка донести основные парадигмы программирования (того подхода, который вы хотите осветить/привить). перл может в принципе реализовывать любой подход, благо дело семантика легко расширяется за счет модулей.

Chupa

Haskell:


factorial :: Int -> Int
factorial n = foldl (*) 1 (take n [1..])

Marinavo_0507

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

Ivan8209

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

Dasar

в целом, сейчас тоже самое.
Ps
я маленько о другом
1. При использовании того же Дельфи мотивация у учеников много выше. Вроде почти ничего не сделал, а уже полноценная программа.
к сведению: консольные программы мало кто из обычных людей (детей) воспринимает, как "круто". Общее мнение скорее: "что это за фигня".
2. Возможность нащелкивания программы - позволяет что-то делать даже, если что-то забыл, т.к. можно нащелкать и посмотреть как должно быть.
ps
еще бы я особо отметил бы возможность intellisense - очень полезная вещь для начинающих.
Позволяет сосредоточиться на написании программы, а не на лазанье по толпе книжек, примеров и хелпов.

Ivan8209

Может, тогда заменить Схему на СМЛ или ОКамл?
---
...Я работаю антинаучным аферистом...

ma3yp

И твой алгоритм Евклида пишется в одну строку.
Можно пример в студию?
И вообще, я не в первый раз сталкиваюсь с идеей учить школьников программированию на лиспоподобных языках. Кажется, у этой идеи очень много фанатов. А теперь скажите: кто нибудь из этих фанатов пробовал сам учить школьников с нулевой базой лиспу, хаскелю, схеме? Отзовитесь! И скажите, какие результаты. Очень интересно было бы послушать.

sany79

Это новый для меня язык. Разобрался -- не сложно. Но написать что-нибудь сложнее -- не получилось.
Когда-то немного разобрался в Прологе. Хоть он и не похож на Лисп/Схему, но программировать на нём довольно тяжело, много непривычных понятий. А главное двусмысленность -- различие между декларативной и процедурной семантикой.
Была мысль коснуться этих языков, но всё ведь не успеешь...

Marinavo_0507

> Это новый для меня язык. Разобрался -- не сложно. Но написать что-нибудь сложнее -- не получилось.
А для детей ведь любой язык будет новым, так что это не аргумент, получается.

Dasar

Вот придет школьник домой. Его спросят что ты сегодня нового выучил, и что он будет показывать?
Ввод с консоли числа и вывод факториала? И кому это надо? Кого этим удивишь?
ps
Вот сделать почти word - это круто. Или программку, которая по сети общается.

germafrodita

Я сейчас, может быть, скажу не по делу, но всё же.
Не стоит учить детей писать на языках вроде Хаскелл, Схема, Окамл, Лисп (в общем, все те неизвестные обычным людям названия, которые тут встречались). Потому что из детей вырастут зануды вроде КОНТРА. Или что-нибудь еще неприятное вырастет.
Опять же, потом, если детям вдруг нужен будет этот опыт программирования, нигде никому не нужны будут эти Хаскеллы и Лиспы. Насколько я знаком со школьными всякими олимпиадами и прочим, там существуют только два языка:
1) паскаль
2) си (паскаль знаете? си научим)
Поэтому детей следует учить одному из этих языков. Оптимально - сразу Си. Но черт его знает. Чтобы не возникало проблем с компиляцией, всем прочим: думаю, несложно написать какой-то скрипт, обертку, whatever, чтобы компиляция+запуск происходили по нажатию одной кнопкой (как в Borland C++).

germafrodita

Вот придет школьник домой. Его спросят что ты сегодня нового выучил, и что он будет показывать?
Ввод с консоли числа и вывод факториала? И кому это надо? Кого этим удивишь?
Кто спросит? Родители? Интересно, как ему удается удивлять их вычислением "сложных" интегралов или пятеркой по географии?

Chupa

> я не понял вопрос.
Я не считаю щёлкание по кнопочкам программированием.
По крайней мере таким, которым можно чему-либо научить.
Должен оставаться результат работы, причём результат
проверяемый и понимаемый учеником.
Здесь же его действия мало связаны с тем, что получится,
а сама последовательность операций (программа, состоящая из кликов)
не сохраняется.
Как можно быть уверенным, что ученик всё сделал правильно?
Что получится в качестве результата?
Аналогия: я пишу прогу на си, а сдаю в качестве результата только её output.
> ты на дельфи когда-нибудь писал?
было дело

ma3yp

Речь идет о матшколе. И если в матшколе школьник научился считать факториал, то это - круто, школьник это поймет. Особенно, если он сможет посчитать большие факториалы. Кстати, в Питоне встроенная длинная целочисленная арифметика.
А в обычных классах я бы действительно учил бы только на RAD-системах, проще всего на VB. Но в обычных классах большинству школьников не нужно ни вычисление факториала, ни программа с окошками. Им вообще (в большинстве своем) ничего интеллектуального не нужно. И ничему толковому большинство учащихся общеобразовательных классов научить невозможно.

Dasar

Родители, приятели, младший брат(сестра) и т.д.
> удивлять их вычислением "сложных" интегралов или пятеркой по географии
Может поэтому у нас никто географию, историю и т.д. не знают.. Потому что это никому не надо...

sany79

Ну, может, факториал и не такой зажигательный пример.
Но не совсем уверен, что программирование окошек так уж полезно для общего развития. Для собственного творчества у детей тут не так уж много возможностей. Не так уж много творчества в написании программ, активно эксплуатирующих мощные библиотеки.
Хотя замечаю, что из индивидуальных заданий (из второй части моего списка) наиболее популярными оказались игры, даже с убогой консольной псевдографикой, и менее -- "серьёзные" лингвистические задачи.

Chupa

Функциональные языки лучше развивают абстрактное мышление, чем императивные.
Даже если хаскель не понадобится, знакомство с ним может выработать способности к решению
сложных алгоритмических задач. Изучая си или паскаль можно получить только обезьянку-программиста.
Вот кому он нужен, этот си?
> Насколько я знаком со школьными всякими олимпиадами и прочим, там существуют только два языка:
> Поэтому детей следует учить одному из этих языков.
Бугалол! Охуенная импликация.

Dasar

Лучше бы график построили, чем факториал посчитать.

hoha32

И всё-таки учи их прогать на С. Пожалей их старших братьев/сестёр
Почти всерьёз.

Marinavo_0507

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

germafrodita

Мышление в школе развивают другие люди. Учить лиспу, который _никому нахер не нужен_ (я подразумеваю под этим, что, например, у меня нет ни одного одноклассника, с ним знакомым, МГУ - это всё же несколько другая выборка, я думаю) - дурацкая затея.

germafrodita

Насколько давно ты общался со школьником?

Ivan8209

(letrec f (lambda (p) (if (> (car p) 0) (f (list (modulo (cadr p) (car p (car p p (cadr (f '(A B
Вместо A и B вставить числа.
---
...Я работаю антинаучным аферистом...

Dasar

Так стоит сочетать.
Т,е. один урок даешь, что-то красивое, другой урок - умное. Причем объясняешь почему красивое, не самое лучшее.
Вот это действительно дети запомнят и будут использовать.
ps
Использование чужих библиотек - это очень хороший навык, и на сегодняшний день без этого никуда.
Особенно, если правильное использование чужих библиотек, т.е. использование с пониманием.

ma3yp

Я до сих пор думаю над этой проблемой - C++ vs. python.
И пока делаю так: год школьники учатся на питоне, потом я их быстро пытаюсь переучить на C++.
C тяжел в освоении, он слишком обременен какими-то отвлекающими от алгоритма синтаксическими конструкциями. Когда ты пишешь на C ты вынужден думать о языке, а не об алгоритме. Например, мне совершенно не хочется объяснять на первом же уроке, как работает программа "Hello, world" и почему я должен написать столько всего, чтобы программа вывела на экран одну-единственную строку. Поэтому приходится говорить, что все эти строки - это "заклинания", без которых программа не будет работать. Вы их пока пишите, а потом я как-нибудь объясню, зачем же они нужны.
Такой подход не способствует эффективному обучению...

Marinavo_0507

> Мышление в школе развивают другие люди.
Почему ты считаешь, что так должно быть?
> Учить лиспу, который _никому нахер не нужен_
Предлагается учить не лиспу, а программированию.

germafrodita

Например, мне совершенно не хочется объяснять на первом же уроке, как работает программа "Hello, world" и почему я должен написать столько всего, чтобы программа вывела на экран одну-единственную строку.
Я считаю, что представление о том, что такое программа - это полезный навык. А ты?

ma3yp

(letrec f (lambda (p) (if (> (car p) 0) (f (list (modulo (cadr p) (car p (car p p (cadr (f '(A B

Сколько времени тебе понадобится, чтобы объяснить содержание этой программы школьнику, который никогда не занимался программированием?

Marinavo_0507

> Я считаю, что представление о том, что такое программа - это полезный навык. А ты?
В твоём способе, чтобы получить такое представление, нужно долго слушать теоретический курс.
Объяснение "нужно писать #include <stdio.h>, потому что так надо" этого представления не даст.

germafrodita

Думаю, я смогу кратко и быстро объяснить школьникам подобные штуки. Если хочешь, примерно попробую написать объяснение.

ma3yp

Я считаю, что представление о том, что такое программа - это полезный навык. А ты?
Я считаю, что учащихся матклассов нужно учить алгоритмике: умению формализовать задачу и придумать алгоритм ее решения. Отвлечение на языковые тонкости С/C++ этому не способствует.

Dasar

> Похоже, ты предлагаешь не учить детей программировать, это тоже вариант конечно.
Я предлагаю, сначала детей научить писать программы. И только после этого учить программировать (алгоритмизировать).
Писать программы - это довольно легко и реально нужно в жизни, программировать (алгортмизировать) - это уже advanced навык.
Навык "писать программы" можно сравнить с навыком "арифметика". Эти навыки всем нужны, и всеми используются.
"Программирование" - это уже можно сравнить с навыком "составлять уравнению", т.е. это навык, безусловно полезный - голову развивает, но реальное использование - нулевое.

sany79

Паскаль знаю фигово, а C/C++ получше.
Я вижу, многие советуют экзотические языки, возможно, только в силу их экзотичности. Я отдаю дань и одному экзотическому языку -- METAPOST'у. Дети радывались, когда своими руками нарисовали треугольник, его описанную окружность, семейство прямых Симсона, увидели, что они огибают трёхлучевую гипоциклоиду -- дельтоиду Штейнера, которая к тому же чудесным образом описана около треугольника и его окружности девяти точек, а вершины её образуют правильный треугольник, расположенный подобно треугольнику Морли. Программа в 30 строчек. Тут есть о чём подумать, к тому же мне в помощь, т. к. я веду также и геометрию.
Что касается олимпиад, то мои дети второй год по округу занимают вторые места. Правда, дети весьма неслабые, а половина задач такова, что делается в 2 строчки на Перле, чего не скажешь о др. языках. Но подготовку олимпийцев не считаю такой уж важной задачей, точнее, специально не готовлю к олимпиадам. Там популярны графические задачи, а я графикой почти не занимаюсь.

germafrodita

Хорошо. Такой вариант.
По нажатию кнопки F5 программа вставляется в "#include <.... void .... { <сюда> return 0;} ...", после чего компилируется и вызывается. Такое ведь можно сделать, правда?

Ivan8209

У этих языков стиль программирования другой.
Более принято использовать мелкие подпрограммы.
Гораздо мельче, чем в Си, Паскале и подобных.
Насчёт МЛ подумай.
Они всё-таки выглядят привычнее, чем лиспы.
Прологу я бы не взялся учить.
Пример с Евклидом выглядит примерно так:
fun gcd (a, b) = if a>0 then f b mod a a) else b;
gcd(a,b);
Или, как писал я,
let gcd (a, b) = if a>0 then f b mod a a) else b in gcd(a,b) end;
---
...Я работаю антинаучным аферистом...

hoha32

Ну с сильными учениками всегда можно экспериментировать. Они разберутся. А вот рядовой школьник, которому для начала придётся объяснить для чего ему это программирование вообще надо, вряд ли.

ma3yp

Я привел "Hello, world" в качестве примера.
На самом деле подводных камней в C/C++ значительно больше и #include<stdio.h> дело не ограничивается.
К тому же программировать на C/C++ и совершенно не рассказывать про #include - это профанация.
Синтаксис Pascal и особенно Python в значительно большей степени дружелюбен.

sany79

и пап. Представляю, как один папа с кафедры Выч. мат. с проклятьями по ночам программирует для сына на ненавистном языке Было дело. Но папа при встрече претензий не высказал
Но чем же Си облегчит жизнь родным и близким?

Ivan8209

Если записать это не в одну строчку, а в три, то будет то же, что и у тебя.
---
...Я работаю антинаучным аферистом...

hoha32

Специалиста среди знакомых найти проще

Chupa

> Но чем же Си облегчит жизнь родным и близким?
Они будут думать, что ребёнка учат именно программированию, а не чему попало.

ma3yp

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

Ivan8209

Это не экзотические языки, а очень даже распространённые.
Только не в кругах "насильников" и "приплюснутых насильников."
Языки, которые будут помощнее
и не будут требовать выполнять руками ненужную работу,
вроде выделения памяти под массивы или списки.
---
...Я работаю антинаучным аферистом...

Ivan8209

Рекурсивное определение в явном виде.
Вообще, алгоритм Евклида --- это не самый лучший полигон для сравнения языков.
Так же, как и факториал.
Так же, как и "Hello, world!".
Смысл, что можно написать такую короткую программу:
." Hello, world!"
Это же не скажет о языке?
---
...Я работаю антинаучным аферистом...

sany79

Полностью согласен. Поэтому предлагаю задачи разного уровня сложности. Чтобы и девочки не скучали и не говорили, что "я вообще ничего не понимаю". Хотя встречаются девочки, весьма ловко программирующие.
Когда я начинал работать, меня предупреждали: не надо сильно наседать на девочек. Они типа для красоты. Кто же спорит. Да и мои предшественники, студенты, видимо, пытались учить Си и лиспу (вроде как я понял, не очень успешно. Дети утверждали, что ничего из той науки не поняли. Я это пожелание стараюсь учитывать, но проблема оказалась не столь серьёзной. Но, с другой стороны, ограничиваться офисными задачами (word, excel) не хочу.

Dasar

С первыми курсами периодически общаюсь. и что?

ma3yp

Ладно, перехожу от флейма к аргументации в пользу Питона.
1. Питон - современный язык, использующийся в промышленном программировании.
2. Питон имеет простой синтаксис.
3. Существуют реализации Питона под Windows, Linux, Mac (и это очень важно. Например, у меня есть школьник, у которого дома - Mac).
4. Как я уже говорил, красивое форматирование текста в Питоне - требование языка.
5. Переменные в Питоне нетипизированны (как в перле). Это мне кажется достоинством, поскольку опять таки не нужно отвлекаться на возню с типами данных (это хорошо для первоначального освоения).
6. Питон имеет мощную библиотеку. Есть графическая библиотека. Можно создавать оконные приложения.
Большие возможности по работе со структурами данных: есть встроенные списки и встроенные ассоциированные массивы.
7. Длинная целочисленная арифметика.

hoha32

О! Есть идея показать особо усидчивым ассемблер

Ivan8209

Может, добавить какой-нибудь генератор бреда?
Наподобие "Dissociated Press."
Переформатирование текста, вроде ограниченного fmt.
Решение системы линейных уравнений.
Это, кстати, очень хорошо пригождается.
Хотя и достаточно просто.
---
...Я работаю антинаучным аферистом...

sany79

Нет, это ислючено

sany79

Да, это хорошие предложения, спасибо!

hoha32

А что так? Полезно иногда В качестве факультатива
Или я тебя правильно понял?

Ivan8209

Для лиспа всё то же,
но хорошая поддержка текстовыми редакторами вместо 4.
Включая Схему.
Скорость выше, чем у Питона.
Мощные средства развития.
---
...Я работаю антинаучным аферистом...

Gasparfx

По моему, в вопросе выбора языка нужно учитывать не его простоту, удобочитаемость, возможности, знания преподавателя, наличия необходимой платформы и тому подобные аргументы, а как мне кажется, детей нужно учить тем языкам, которые сейчас наиболее востребованы на рынке информационных технологий, и знание которых в 99% случаев указывается в объявлениях о найме программистов например на job.ru. IMHO это С, Delphi, java, perl, а также HTML и Web-дизайн. Также на уроках информатики в школе нужно учить не какому-то конкретному языку, а умению прежде всего думать, чтобы потом при необходимости человек легко мог освоить нужный ему язык.

ma3yp

Ну не верю я в Лисп, как учебный язык в школе!
Есть хотя бы один пример такого его использования?

sany79

Да. мне советовали питон. Но чем он выигрывает перед перлом (питон я не знаю)? Тем, что несколько современнее?
Тем, что форматирование обусловлено синтаксисом? А это хорошо или плохо? Стараюсь учить нормальному форматированию, без хамства -- закрывающая скобка под открывающей, отступы, все дела.
И длинная целочисленная арифметика в перле есть, и другие названные вещи. И ООП.

Ivan8209

Можно ещё ознакомить с подгонометрией.
В частности, линейная подгонометрия очень нужна.
Школьники какие?
---
...Я работаю антинаучным аферистом...

myrka68

дайте доку по питону
прочитал тред и захотелось увидеть, что это за язык
P.S.
КОНТРА реальзо заёб своим занудством и глупостью

ma3yp

Перл сильно заточен под специфические задачи. И в этом его недостаток.
Питон более универсален. И библиотека у него поуниверсальней будет
(со всей библиотекой можно познакомиться здесь.
Ничего страшного в его незнании нет, он не сложнее бейсика, и проще перла по синтаксису.

sany79

Очень верно сказано. Если бы время позволяло... Особенность школы такова, что в 9 класс дети приходят в т. ч. и из других школ, с разными навыками и знаниями. Очень тяжело всё это охватить. К тому же я сам не профессиональный программист. Много времени уходит на привыкание к командной строке, на привыкание к vim'у. Дети почему-то стремятся писать интерактивные программы, которые вынуждают пользователя вводить данные из STDIN, а не из командной строки, и это непросто лечится. Нужно также научить минимальному администрированию. Короче многому нужно учить, а времени мало. Но ведь кому нужно, и в вузе научится всем названным умениям.

Ivan8209

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

ma3yp

Дока по питону: http://www.python.org/doc/2.3.3/
Мои листки по питону для школьников (9-й класс): http://179.mioo.ru/python/

sany79

В каком смысле какие? Обычные. "Дети родителей", т. е. у многих родители имеют отношение к ММФ. 9--11 класс.

Ivan8209

В некоторых технарях в Штатах, говорят, успешно применяется.
Можно использовать не Лисп, а МЛ.
Про это что-то никто ничего не сказал.
---
...Я работаю антинаучным аферистом...

Ivan8209

Какой-то уклон есть?
Или обычная средняя?
---
...Я работаю антинаучным аферистом...

sany79

>Чтобы учить программировать нужен язык,
>в котором не надо много думать о вспомогательных вещах.
Слышал мнение, что лучше всего учить на псевдокоде, не имеющем реализации. Вроде очень забавного и объектно-ориентированного из книжки Кушниренко и Лебедева, по которой меня учили на 1 курсе.
Боюсь, что годится для курса "Программирование" на ММФ, не подходит для школы.

ma3yp

Говорят, говорят...
Конкретную информацию хочу. Методичку хотя бы...
Да, а что такое "технарь в штатах"?

sany79

Есть уклон. Классы при мехмате. Но там и в обычных классах есть дети не хуже -- вёл там кружок. А школа обычная средняя.

Ivan8209

То есть можно считать, что с математическим уклоном?
Как насчёт символьного дифференцирования?
Оптимизации?
---
...Я работаю антинаучным аферистом...

sergey_m

TZ, я поддерживаю эту идею.
Лично мне кажется, что поверхностное знание perl пригодилось бы очень многим людям. У меня в жизни накопилась масса примеров. Много раз я видел людей тратящих часы и дни в текстовом редакторе MS Word делая какие-то тупые действия, которые легко решаются на perlе за 5 минут. Я наблюдал это в лабе, на работе мамы, на работе знакомых и еще в куче разных мест. Апофеозом было, когда несколько человек с нашего курса, включая мою подружку проходили практику в какой-то конторе, где троим девушкам дали несколько мегов текстов, которые нужно было обработать определенным образом. За вечер я написал программу на perl, которая это делала. Потом еще одна девушка написала программу загружающую аутпут моей в MS Access и все дела. То есть было сэкономлено 3 человеконедели.
Заметим, что все эти люди учили в школах Паскаль или Бейсик, в лучшем случае С. Причем школьные курсы как правило сосредоточены на решении уравнений, сортировке и прочей алгоритмике. Это совершенно не пригодится людям в жизни. А вот обучить их мощному текстовому инструменту - самое оно.

Chupa

> Да, а что такое "технарь в штатах"?
Какой-нибудь MIT, наверное.

Ivan8209

MIT, насколько мне известно, не "college."
---
...Я работаю антинаучным аферистом...

Chupa

Ты на вопрос отвечай, а не выпендривайся.

sany79

"Учить" и "делать вообще" не совсем одно и то же.
А на C написана святая святых -- ядро и куча системных и прикладных программ. Не погорячился ли ты?.. При всём моём уважении к лиспу?..

Ivan8209

>>Чтобы учить программировать нужен язык,
>>в котором не надо много думать о вспомогательных вещах.
> Слышал мнение, что лучше всего учить на псевдокоде,
> не имеющем реализации.
Мнение любопытное.
В школе мы поначалу (может, даже год) учились алгоритмике без языка программирования.
---
"...По волнам моей памяти,
Исчезая в этих волнах..."

ma3yp

Заметим, что все эти люди учили в школах Паскаль или Бейсик, в лучшем случае С. Причем школьные курсы как правило сосредоточены на решении уравнений, сортировке и прочей алгоритмике. Это совершенно не пригодится людям в жизни.
Если речь идет о матшколе/матклассах, то как раз и нужн заниматься со школьниками решением уравнений, сортировкой и прочей алгоритмикой. А уж перлу они и сами научатся, да и как его применять - догадаются. Потому что их научат главному - думать.

sany79

Да, в своё время один местный деятель, , горячо рекомендовал Перл, которому сам научился на работе в издательстве. Видимо, нет ничего лучше для того, чтобы быстро причесать уродскую рукопись, где дурак-автор ставит пробелы перед точками и запятыми или что ещё похуже.

Ivan8209

(Для : http://schemers.org/Education/ )
http://www.schemers.com/schools.html
---
...Я работаю антинаучным аферистом...

Gasparfx

А почему у вас в школе на рабочих компах стоит Линукс, на котором работают дети и учатся программированию? Я конечно ничего против линукса не имею, и сам за ним сейчас сижу, но по моему, это создаёт дополнительные сложности для процесса обучения. Всё таки стоит признать, что де-факто стандартом сейчас является windows, на котором работает Deplhi и другие языки, также школьникам не надо тратить время на осваивание навыков работы в экзотической (для них) ОС. К тому же это создаёт проблему с домашними заданиями и самостоятельным творчеством, т.к. в 99.9% случаев на их домашних компах стоит windows, и они не смогут воспроизвести или повторить дома то, что проходили в школе. Тем более, если у самого преподавателя есть сложности в освоении некоторых аспектов работы (вышеупомянутого Vim'a).

sany79

И меня учили в школе на Ерше и потом на Бейсике. Но, возможно, это была вынужденная мера, т. к. практики на машинах не было. И ещё я слышал, что отсутствие реализации Ерша было некоторой проблемой. Её, правда, решили мехматские люди из группы ИнфоМир, но было поздно -- на смену Агатам и Ямахам пришли персоналки с чудесными Борландовскими компиляторами для ДОС.

ma3yp

Спасибо!
Там много ссылок, я в них теряюсь. Сразу же отбрасываю Colleges & Universities - возраст не тот.
А хочу я всего-навсего ссылку на руководство по обучению программированию на схеме с нуля.
Для школьников 14 лет.

Ivan8209

Кстати, почему vim?
Поставь лучше что-то более приличное, хотя бы вроде joe или jed.
Лучше --- emacs.
А вообще, мнение должно иметь какую-то почву.
Я, например, не вижу, почему плохо учиться первое время без машины.
---
...Я работаю антинаучным аферистом...

sergey_m

Если речь идет о матшколе/матклассах, то как раз и нужн заниматься со школьниками решением уравнений, сортировкой и прочей алгоритмикой. А уж перлу они и сами научатся, да и как его применять - догадаются. Потому что их научат главному - думать.
Я учился в физмат школе. Со мной в классе был победитель межнара по математике. Кстати, он сейчас живет в ГЗ и закончил мехмат. Возможно если прочтет этот тред, то подпишется под моим мнением. В кабинете информатике нас учили Паскалю и книжным алгоритмам - сортировке, уравнениям и прочему. Вот только в голове у человека на отложилось представлений о файловой системе, процессах и прочих азах. И сейчас у него с компьютером туго, и толку ему от того Паскаля и алгоритмов - ноль. И эффективно применять компьютер он не умеет. А думать он и так отлично умел и без кабинета информатики.
В школе нас учат читать, писать и считать. А работать на компьютере не учат. Выходя из школы мы умеем читать быстрее чем разговариваем, умеем считать в столбик и писать без ошибок. А работать на компьютере не умеем. Люди приходят в офис и работают за компом далеко не оптимально - делают какие-то лишние действия, относятся к нему как к волшебному ящику. Это все напоминает чтение по слогам.

Ivan8209

Возьми и напиши учителям.
Адреса школ указаны.
---
...Я работаю антинаучным аферистом...

ma3yp

А почему у вас в школе на рабочих компах стоит Линукс, на котором работают дети и учатся программированию?
Кстати, интересный вопрос. Тоже хочу на него ответ услышать.
У меня в школе стоит Linux потому что:
1. Его удобней администрировать.
2. Лучше, если они научатся работать с линуксом в школе, и не будут потом мучаться на мехмате.
К тому же это создаёт проблему с домашними заданиями и самостоятельным творчеством, т.к. в 99.9% случаев на их домашних компах стоит windows, и они не смогут воспроизвести или повторить дома то, что проходили в школе.
Почему же? Под Windows есть и Перл, и Питон, и даже C/С++
Тем более, если у самого преподавателя есть сложности в освоении некоторых аспектов работы (вышеупомянутого Vim'a).
А вот vim'а можно и не касаться. Есть много вполне традиционных редакторов. Я, например, школьникам рекомендую nedit (а сам пользуюсь vim).

sany79

Насчёт стандарта де-факто можно и поспорить, но тема уж очень опасная Да и уж если таков стандарт де-факто, то не так уж это и здорово. И на мехмате сейчас стандарт не Windows, а многие дети поступают именно туда.
Многие дети ставят дома и Линукс. Затем мне самому в сто тысяч раз проще администрировать класс (это моя забота). NFS+YP+ftp+ssh рулит. И ещё. Собирать и ставить разномастный и часто пиратский софт мне не нравится.
И разве есть такая замечательная командная строка в Windows, которая при нажатии на <TAB> сама подсказывает, что писать?

sergey_m

этот тред давно пора перенести в Programming

ma3yp

И разве есть такая замечательная командная строка в Windows, которая при нажатии на <TAB> сама подсказывает, что писать?
Есть. В Win XP.

ma3yp

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

Gasparfx

Ну, если у вас такие крутые дети, то я снимаю все свои вопросы...
Насчёт преимуществ Линукса, с этим я полностью согласен.

sany79

Проблема с vim только одна. Невнимательные дети жмут на выходе ^Z^Z вместо ZZ. Со всеми вытекающими последствиями. На борьбу с этим уходит много сил. Но я бы не стал бы подключаться к сравнению vin и emacs -- будет война! Начинал сам с joe, но потом захотелось большего, стал выбирать между vim и emacs. Зашёл в emacs и не знал как выбраться назад, да и забросил. Ничего личного.
Насчёт учиться без машины. Возможно, это хорошо, но мало времени, а машину освоить совершенно необходимо.

Ivan8209

cmd/?


Завершение имен файлов и папок НЕ ВЛЮЧЕНО по умолчанию. Можно
включить или отключить завершение имен файлов и папок для
конкретного вызова CMD.EXE с помощью ключей /F:ON или /F:OFF.




M:\>ver
Microsoft Windows 2000 [Версия 5.00.2195]


---
...Я работаю антинаучным аферистом...

ma3yp

В Win2000 автозавершение имени в командной строке неудобное. В XP оно гораздо приятней и перевешено на клавишу табуляции

sany79

Да ну, complete в Windows -- отстой! По сравнению с bash/zsh.

evgen5555

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

Ivan8209

> Зашёл в emacs и не знал как выбраться назад, да и забросил.
Вообще-то он пишет большими буквами, как из него выбраться и что делать.
Это приходится потом отдельно отключать.
> Насчёт учиться без машины.
> Возможно, это хорошо, но мало времени,
> а машину освоить совершенно необходимо.
Со временем помочь не могу.
Смотри сам.
Правда, если никак не успеваешь, то вообще непонятно, что делать.
---
...Я работаю антинаучным аферистом...

sany79

Знатоков C я не удерживаю и не отговариваю писать на C. Такие дети бывают. Но всё же при прочих равных короткая программа лучше длинной.
На Перле, к примеру, программа заменяющая несколько идущих подряд знаков новой строки на одну, занимает одну строчку, то на C -- уже десяток-тругой.

Ivan8209

Можно, конечно, и поставить bash от CygWin.
Речь не об этом.
---
...Я работаю антинаучным аферистом...

evgen5555

Это особенность перла - работа со строковыми данными. А как же быть со стандартными алгоритмами?

hoha32

Кстати, просветите заодно плз, перл - это просто интерпретируемый язык? или компилируемый?

evgen5555

и то, и другое

Kira

учи их Java.

ppplva

Компилируемый при запуске программы.

hoha32

ХитрО.

hoha32

Прям так безаппеляционно?

evgen5555

Да бля, чувак, хорош офтоп разводить и слушать долбоёбов. perlcc - компилятор перла, perl - интерпретатор.

sany79

прямо точно выразил то, что я сам хотел сказать.
Мой предмет называется "информационные технологии" и программирование -- не единственная моя цель. Главное -- научить не бояца чудесного ящика, научить работать с файлами, а не с окошками, с командной строкой а не с мышкой.
Щёлкать мышкой унизительно и недостойно грамотного пользователя. Графическая оболочка хороша для игр/телевизора/GIMP/интернета, но большинство серьёзных задач прекрасно решаются на консоли или в терминале. Ужасно жаль становится людей, которые и не знают, что копировать файл можно не только путём перетаскивания. Как неэффективно они расходуют рабочее время!

myrka68

работаю с явой уже почти год -- впечатления просто ужасные
С/С++ гораздо приятнее
а учить программированию, думаю, лучше на делфи, т.к. быстро осваивается и имеет хорошую визуальную составляющую
(сам с делфи не работаю, раньше немного баловался)

sany79

Компилируемый (если уместно так говорить о языке). Компилируем в память и исполняем тут же.

Ivan8209

Тогда, может, тебе надо преподавать работу с уникс или гну?
То есть "file utils," "text utils," sed, awk, sh, "shell utils."
---
...Я работаю антинаучным аферистом...

sany79

Стараюсь делать и это по мере возможностей.

myrka68

> Тогда, может, тебе надо преподавать работу с уникс или гну?
> То есть "file utils," "text utils," sed, awk, sh, "shell utils."
что за привычка всё время лезти в дебри?
ну нах школьнику знать про sed и awk?
обучать надо _принципам_ работы
, прочитав ещё раз твои посты, думаю, что perl - самое то, хотя может python получше будет (по-моему, перл -- уродство , которое я не смог понять )

sany79

Конечно, sed и awk идут отдыхать, при всём уважении... Ограничиваюсь cp, mv, diff. Никакого программирования на sh. Хотя дети спрашивают о командных файлах, вроде .BAT. Но это просто, когда надо запускать несколько команд подряд -- более сложные задачи не имею возможности обсуждать.

Ivan8209

А ты считаешь, что я СИИ пишу на awk?
Тот же cut не даёт некоторых возможностей.
Только всё равно есть большая разница между почти исключительно
потоковым программированием в sh
(большие скрипты не будем рассматривать)
и программированием вообще.
Поэтому ни перл, ни питон преимуществ даже в "стандартности" не имеют.
Кстати, основным языком GNU для расширений является Схема,
как это ни странно.
---
...Я работаю антинаучным аферистом...

sany79

А что такое СИИ?

myrka68

оч хорошо, а теперь подумай, как это применимо к школьникам 9 класса?
ответ - никак
поэтому, прежде чем советовать хрен знает что (не спорю, что это оч сильные средства подумай, кому направлен твой совет
функциональные языки преподавать детям не стоит, т.к. поймут только единицы, а остальные банально забьют

Ivan8209

Системы искуственного интелекта.
---
...Я работаю антинаучным аферистом...

germafrodita

Это совсем другое. Студенты не показывают "чему они научились".

valeriy1

2TZ:тоже поддерживаю твой выбор
в перле есть масса удобных вещей, несмотря на его корявость

germafrodita

КОНТРА, детей не нужно учить бесполезным вещам. Лиспу они сами научатся, если нужно. Так же как и программированию прикладных задач. Потому что нет особенно разницы: школьник не может что-то написать на С, или школьник не может нигде найти интерпретатор Лиспа.

Ivan8209

awk очень помогает при обработке однородных списков.
cut работает не то, чтобы не всегда, а очень редко.
Например, выборку каждой десятой точки (для построения разреженного графика) удобнее делать с помощью awk, а не чего-то ещё.
У тебя есть основания?
Почему ты считаешь, что ФЯ преподавать не стоит?
Ты математику пишешь исключительно в алгоритмическом виде?
Функциональная запись привычна, она основана на математике,
которую учат с 5-го класса.
К школьникам 9-го класса применимо легко.
---
...Я работаю антинаучным аферистом...

Ivan8209

> школьник не может нигде найти интерпретатор Лиспа
Если ничерта не знаешь, не лезь.
Найти лисп-систему не просто, а очень просто.
Тем более под Линукс.
---
...Я работаю антинаучным аферистом...

Dasar

> Это совсем другое. Студенты не показывают "чему они научились".
Откуда такая уверенность?
ps
Помню свои первые курсы, и помню то уважение, зависть и т.д., когда кто-то делал реально клевую и полезную программку.
ззы
Тоже самое было и в школе, только масштаб был чуть другой

Kira

угу. именно так. потому что так как это мат.школа то многие из учеников станут програмистами. то есть им будет нужно ООП. а java как раз учит писать "красивые" проги с его применением. Хотя вопрос в том можно ли переходить в ООП минуя структурное программирование в обучении - давольно сложный. Но для миня переход к ООП после учёбы в школе был очень болезненным. Так что уж лучше пусть сразу.
зыж всё выше - имхо не претендующее на истину в последней инстанции.

germafrodita

Если ничерта не знаешь, не лезь.
Я представил себе, как ты скажешь это школьнику.

ma3yp

А вот мнение Эрика Реймонда по поводу первого языка программирования:
Q: Your writing "How to become a hacker" is a well known piece on the Internet. I think I can remember you were recommending Perl as a first language a few years ago. Now, you changed Perl for Python. When did this change occured? Why this change?
The change occurred in November 1998, about two years after the first version of the FAQ, as a result of my personal experience with Python. I had been using Perl, but found that Python seemed to encourage more maintainable code -- with the difference in maintainability growing quite dramatic at 1000 lines and up.
Q: You're a very experienced programmer, which languages have you been using ? Which ones do you still use regularly ? How would you situate Python among other languages?
These days I write Python when I can and C when I must. Despite minor flaws, I think Python is the most expressive and powerful language I have ever used; it has even seduced me away from my old-time loyalty to LISP.
Полный текст интервью.

sany79

Как-нибудь посмотрю питон. У меня нет предубеждения против него. Хотя я и не совсем проникся его достоинствами перед перлом.

solteron

В питоне, например, более мощные и гибкие средства ООП. Если оно надо

sany79

Это какие же? Виртуальное наследование?

sergey_m

Тогда, может, тебе надо преподавать работу с уникс или гну?
То есть "file utils," "text utils," sed, awk, sh, "shell utils."
Нет. Полноценный perl есть под Win32. Но нет полноценных unix tools.
Прошу не отвечать на этот пост ссылками на разные поделки типа interix, utools и прочее.

Marinavo_0507

Я вот тут ещё подумал:
кажется, что для учебного языка (точнее, среды) важным свойством
является интерактивность, то есть хотя бы классический цикл read-eval-print
изучать язык так гораздо веселее
насколько я понимаю, для перла и питона это либо есть в поставке,
либо делается довольно простой программой
языки lisp- и ml- семейства тоже обязательно включают такие средства
lisp наверное всё-таки не очень хороший вариант, так как быстрое чтение программ на нём -
это всё-таки особый скилл, как можно увидеть из примеров контры
про ml тут вроде ещё не было рекомендаций - можно посмотреть на ocaml
его изучение доставило мне очень большое удовольствие
опять же одинаково хорошо подходит для императивного, и для функционального программирования
но перл и питон - тоже очень неплохие варианты имхо

Marinavo_0507

если кто вдруг не понимает про интерактивность, тогда вот


Objective Caml version 3.07+2
# let rec gcd (a, b) = if a = 0 then b else gcd (b mod a, a);;
val gcd : int * int -> int = <fun>
# gcd (9, 15);;
- : int = 3

Chupa

Мне не понравилась в ocaml работа со строками.
Уж слишком они привязаны к аппаратным особенностям.
Для примера, в haskell строка - это список символов (по определению, String = [Char]).
Соответственно, к строкам можно применять стандартные операции для
работы со списками типа map, reverse итд, а также делать pattern matching.
В ocaml же, например, эти List.map и String.map независимы, и если использовать,
списки и строки в одной программе, то нужно или порядок включения
модулей подбирать, или явно указывать, какой map мне нужен.
В результате в процессе обучения появляются дополнительные сущности,
создающие сложность понимания.

Marinavo_0507

да, есть такое
мне тоже не очень нравится
и ещё в стандартной библиотеке нет explode : string -> char list и соотв. implode
то есть я не нашёл
и ещё строки мутабельные
зато так эффективнее с точки зрения производительности
идеального языка я не видел ещё

Chupa

> Конкретную информацию хочу. Методичку хотя бы...
По поводу обучения Haskell (там, правда, только universities): http://haskell.org/classes/

Ivan8209

> про ml тут вроде ещё не было рекомендаций - можно посмотреть на ocaml
> его изучение доставило мне очень большое удовольствие
Просто все настолько увлеклись спором, что не заметили.
У МЛ есть один недостаток: придётся объяснять типизацию.
Это довольно сложно.
Кстати, есть ещё "короткий разговор."
Но я его не знаю и потому ничего не скажу.
Мне настолько не понравилось, что я и не очень-то глядел.
---
...Я работаю антинаучным аферистом...

Marinavo_0507

> У МЛ есть один недостаток: придётся объяснять типизацию.
Вроде бы можно отложить, на простых примерах она не заметна.
Отсутствие строгой типизации тоже надо объяснять.


perl -e 'print "A"-"B", "\n"'
0


почему так?
> Кстати, есть ещё "короткий разговор."
> Но я его не знаю и потому ничего не скажу.
Маза ОО тоже надо объяснять, и это сложнее.

ma3yp

там, правда, только universities
Не катит. universities и школа - совершенно разные вещи.
У меня есть школьники, которые через полгода "изучения" программирования не могут понять, что такое цикл. Ну вот так у них мозги устроены, не по-программерски.

Marinavo_0507

Блин, вот для вправления мозгов была книжка клёвая, но я забыл сохранить ссылку, а потом не нашёл
Именно, как "программистское" мышление применяется в повседневной жизни, даже не только с компьютерами,
но в основном с ними.

ma3yp

perl -e 'print "A"-"B", "\n"'
Объясняется это так, вернее, это просто не надо объяснять.
Есть разные объекты - строки и числа. Числа можно складывать, вычитать, умножать, делить. Строки можно только складывать, и это называется умным словом "конкатенация". Применение же оператора вычитания к двум строкам приводит к такому результату, потому что нет смысла в вычитании строк.
И вовсе не нужно объяснять, почему с точки зрения перла это действие имеет смысл. Достаточно сказать, что оно просто нелогично и не следует им пользоваться.
Кстати, вот и достоинство Питона по сравнению с Перлом. В Питоне print "A"-"B" не прокатит. Ошибка будет, "unsupported operand type(s)"

Ivan8209

> Вроде бы можно отложить, на простых примерах она не заметна.
Я бы сказал, что только на очень простых.
Я пытался сделать map по-лисповски.
Не понял, как это можно сделать, мешает типизация.
Или получается очень сложно.
> Отсутствие строгой типизации тоже надо объяснять.
Хм. Вот этого никогда не надо было объяснять.
> почему так?
Перла я настолько не знаю.
>> Кстати, есть ещё "короткий разговор."
> Маза ОО тоже надо объяснять, и это сложнее.
Не знаю.
Кто-то говорил, что он создан для обучения детей.
Я не проверял.
А вот твоё замечание про ОО относится не только к "разговору,"
но ещё и к "Яве" с "плюсами."
Замечание считаю верным.
Я до сих пор не понимаю смысла в этом "ОО."
Оно мне кажется больше предметом веры, чем чем-то разумным.
Я пока не видел красивой ОО-программы.
---
...Я работаю антинаучным аферистом...

Marinavo_0507

> Числа можно складывать, вычитать, умножать, делить. Строки можно только складывать, и это называется умным словом "конкатенация".
В питоне 2 и "2" - разные вещи?
Вот и типизация, которую нужно объяснять.

Marinavo_0507

> А вот твоё замечание про ОО относится не только к "разговору,"
> но ещё и к "Яве" с "плюсами."
Конечно, и типизация там тоже в полный рост, да ещё и не такая красивая.

ma3yp

В питоне 2 и "2" - разные вещи?
Вот и типизация, которую нужно объяснять.
Типизация в том или ином виде присутствует всюду. И даже в Перле.
В Питоне есть типизация данных, но нет типизации переменных. Поэтому 2 и "2" - разные вещи, но можно выполнять присваивания как A="2", так и A=2.
Такой подход мне больше нравится. В перловой типизации легко запутаться,а в C приходится возиться с объявлением типов переменных.

Marinavo_0507

> Поэтому 2 и "2" - разные вещи, но можно выполнять присваивания как A="2", так и A=2.
Для простых примеров нет существенной разницы с ML.
В ML проверка типов делается на этапе компиляции, но ведь в начале
про компиляцию ничего не рассказываем, используем интерактивую среду.
А когда доходим до компиляции, уже я думаю будет понятно, что значит эта ошибка.
То есть, получается, про типы данных всё равно придётся рассказывать, но может быть не сразу.
Система типов перла мне тоже не нравится.

Chupa

> Не катит. universities и школа - совершенно разные вещи.
Тем не менее, факт: у буржуев изучение ФП развито и
хаскель можно изучать в качестве первого языка программирования.
Неспроста ведь это, правда?
> У меня есть школьники, которые через полгода "изучения"
> программирования не могут понять, что такое цикл.
> Ну вот так у них мозги устроены, не по-программерски.
Некоторым ничто не поможет и не надо их приводить в пример.
Другим же непонятны конструкции императивных языков
и их отношение к поставленной задаче.
Функциональные языки в этом плане могут быть гораздо полезнее,
так как на них формулируется в первую очередь что я хочу получить,
а не как именно я хочу это сделать.
Если начинать сразу со второго (императивные языки
то упускается этот очень важный момент, и ученик не видит связи
между задачей и инструментами для её решения.
Что, собственно, и наблюдается.

Ivan8209

> Для простых примеров нет существенной разницы с ML.
Я бы не сказал.
Это только для очень простых примеров.
Возможно, только для чисел.
И то, есть трудности с плавающей запятой.
Особенно в Окамле.
> В ML проверка типов делается на этапе компиляции,
> но ведь в начале про компиляцию ничего не рассказываем,
> используем интерактивую среду.
Хороший стиль предполагает много мелких определений, не так ли?
Уже можно увидеть вопрос различать 'a * 'b -> 'c и 'a -> 'b -> 'c.
> То есть, получается, про типы данных всё равно придётся рассказывать,
> но может быть не сразу.
Возможно, что это удастся как-то отложить.
Я пока не вижу, как именно.
---
...Я работаю антинаучным аферистом...

Marinavo_0507

> Я бы не сказал.
> Это только для очень простых примеров.
> Возможно, только для чисел.
> И то, есть трудности с плавающей запятой.
> Особенно в Окамле.
Ну так сказали же - для разных типов - разные операции.
Это наверное по-любому придётся объяснить. Похоже, не отложить.
Питон, скорее всего, хороший выбор, я его не знаю просто, поэтому не уверен.
> Хороший стиль предполагает много мелких определений, не так ли?
> Уже можно увидеть вопрос различать 'a * 'b -> 'c и 'a -> 'b -> 'c.
А где таких проблем нет?
Только там, где нет простого способа создать пары и списки.
То есть перлы, бейсики, явы, паскали - языки с неразвитыми системами типов.

Ivan8209

> Питон, скорее всего, хороший выбор,
> я его не знаю просто, поэтому не уверен.
Мне он не нравится жёсткими правилами записи.
По большей части это приводит не только к красивому коду,
но и к неразумному написанию.
Можно привести пример двух направлений в Форте:
вертикальный и горизонтальный стили.
Вертикальный стиль исповедуется бывшими насильниками и пасквилянтами,
которые ещё не очень-то перестроились к новому мышлению.
>> Хороший стиль предполагает много мелких определений, не так ли?
>> Уже можно увидеть вопрос различать 'a * 'b -> 'c и 'a -> 'b -> 'c.
> А где таких проблем нет?
> Только там, где нет простого способа создать пары и списки.
В Схеме.
Для того, чтобы вернуть функцию, надо построить лямбду,
что делается достаточно отличным способом.
---
...Я работаю антинаучным аферистом...

ma3yp

Я уже цитировал здесь Реймонда
Только не "How To Become A Hacker".

sergey_m

Кстати, вот и достоинство Питона по сравнению с Перлом. В Питоне print "A"-"B" не прокатит. Ошибка будет, "unsupported operand type(s)"
Привыкай использовать perl -w

Marinavo_0507

А что Cхема?
Там тоже смысл меняется, если лишнюю пару скобок поставить.

Ivan8209

И?
От этого список перестанет быть списком?
Сравни "f a b;" и "f (a, b);" с "(f a b)".
---
"Курс истинно физической химии"

Marinavo_0507

ну теперь объясняй, почему например (f (a b - неправильно

Ivan8209

"(f (a b" --- вычисление композиции функций.
В МЛ этому соответствует "f(a(b"
---
"Курс истинно физической химии"

Ivan8209

Что я хочу донести.
В МЛ, в отличие от лиспов, существует два представления одного и того же по смыслу действия: "f a b" и "f (a, b)".
В первом случае возможна частичная свёртка "f a",
во втором --- нет.
Я не открыл закономерностей,
почему некоторые функции делают по первому способу,
а некоторые --- по второму.
Эта разница может неприятно выползти.
---
"Курс истинно физической химии"

Marinavo_0507

А, понял прикол, в схеме же нет туплов, есть только пары.
Система типов проще - путаницы меньше действительно.
Тогда вот: (f (cons a b или как это там пишется.
Ну в общем, пара - это не то же самое, что список из двух элементов.
Я не против схемы вообще, но вот тратить время, чтобы учиться продираться через нагромождения скобок,
когда у конкурентов - более привычная алгебраическая запись, не очень клёво
То есть скилл нелишний для программиста, а вот для выпускника школы - сомнительный.

Ivan8209

Да, но заметь, что запись через "cons" явно подразумевает отличие.
Что сложно заметить в МЛ.
А через нагромождение скобок продирается Емакс.
Сейчас, кстати, попробую что-нибудь сваять в lisp-mode.


(define (gcd a b)
(if (= a 0)
b
(gcd (modulo b a) a)



С подсветкой соответствующей скобки.
Кстати, можно всё можно делать прямо в Емаксе:


(defun gcd (a b)
(cond equal a 0) b)
(t (gcd (mod b a) a
(gcd 12 4)


---
Escape-Meta-Alt-Control-Shift

Ivan8209

Даже так:


(defun gcd (a b)
(if (equal a 0) b (gcd (mod b a) a


Отступы проставляются автомагически после


C-j runs the command newline-and-indent


---
Q: What is an experienced Emacs user?
A: A person who wishes that the terminal had pedals.

Marinavo_0507

> Что сложно заметить в МЛ.
Пара скобок и запятая - типа недостаточно заметное отличие?
Это спорно.
> А через нагромождение скобок продирается Емакс.
Да, это несколько уменьшает вред от проблемы, которой у конкурентов просто нет

Ivan8209

Дело не в паре скобок и запятой.
Дело в том, что для выражения одного и того же действия есть две равносложных записи.
Причём используются обе эти записи, но часто непонятно из каких соображений.
Вот это неприятно.
А скобки это точно такая же непроблема, как и в МЛ.
Обычная игра между громоздкостью записи и количеством скобок.
Без текстового редактора, напомню, в наши дни работают только умельцы-радикалы.
Да и то не все, а только самые умелые и самые радикальные.
---
...Я работаю антинаучным аферистом...

ma3yp

Это все-таки извращение:
(define (fact n) (if (= n 0) 1 (* n (fact (- n 1
Вот мы провели со школьниками несколько занятий и хотим показать им что-то серьезное, например, как факториалы считать. Ты сможешь объяснить, как работает этот пример в течение получаса хотя бы? Я в это не верю.
И что касается "emacs со скобочками разберется". Школьники уже в трех вложенных скобках путаются, даже с подсветкой синтаксиса. А тут такие крокодилы...

ma3yp

Ну вот такой пример, я в Лиспе сам не разбираюсь, но догадываюсь, что
if (= n 0) 1
это
if n==0:
в Питоне. Какая из двух записей проще?

Ivan8209

Первая.
Для того, чтобы осознать это, напиши интерпретатор.
Однородная запись всегда проще.
---
...Я работаю антинаучным аферистом...

ma3yp

А, я понял важное требование к учебному языку.
Запись всех выражений должна быть только инфиксной.
Задолбаешься учить школьников префиксной или постфиксной форме записи. И ради чего? Чтобы потом им опять на инфиксную переучиваться?

Chupa

> А, я понял важное требование к учебному языку.
Он должен быть human-readable, а не "только для контра".

ma3yp

Я говорю про простоту не с точки зрения интерпретатора или человека, написавшего интерпретатор.
А с точки того, как это объяснить школьнику 14 лет, никогда не занимавшегося программированием.

Ivan8209

Легко.
Основываться на математической записи.
n! = если (n=0 то 1, иначе n * (n-1)!
А про какую подсветку говоришь ты, я не знаю.
Емакс подсвечивает соответствующую скобку.
Если таковой нет, это тоже указывается цветом.
---
"...Надо учиться --- не напрягаясь!.." Акад. А. А. Бучаченко.

Chupa

> Запись всех выражений должна быть только инфиксной.
Это избыточное требование.
Иногда нужно иметь возможность работать с такими
операциями как с функциями от двух аргументов.
Например, как в приведённой здесь проге на haskell,
где (*) - префиксная запись инфиксной операции *

Ivan8209

У Reduce было такое.
Не знаю, перенесли ли это на Scheme или Common Lisp.
---
...Я работаю антинаучным аферистом...

Chupa

> n! = если (n=0 то 1, иначе n * (n-1)!
а теперь сравни с
fac n = if n==0 then 1 else n * fac (n-1)

ma3yp

Тут уже кого-то спрашивали, давно ли он общался со школьниками в последний раз?
Посмотри мое замечание про инфиксную форму записи. Префиксная запись неприемлема потому, что школьники к этому моменту научены только инфиксной записи и ничего другого они себе и помыслить не могут. Поэтому аргументация "основывается на математической записи" не проходит.
Не спорю, возможно, такой подход к программированию действительно хорош. Но обучение таким вещам с нуля будет сопряжено с огромными трудностями. И язык весьма недружественный по синтаксису к пользователю.
Теперь о подсветке синтаксиса. Да, я и имею ввиду редактор, который при выделении скобки подсвечивает парную ей. Так вот, школьников нужно учить работать с таким редактором и учить обращать на это внимание. Если ты думаешь, что достаточно один раз сказать, и они это запомнят и с благодарностью будут успешно этим пользоваться - ты глубоко ошибаешься. Им просто не хватает навыков работы с компьютером, они при работе отвлекаются на другие вещи, которые ты привык делать на автомате.
Ну еще, например, школьников нужно учить читать сообщения об ошибках. Да, да, если человеку пять раз объяснить, что "parse error" означает "синтаксическая ошибка", то тогда они это запомнят. Но не раньше, чем с 5 раза и не раньше, чем через несколько занятий таких экспериментов.

Ivan8209

О, присоединяйся к вопросу о "a->b->c" и "a*b->c".
Из каких соображений выбирается та или иная запись?
Ещё будет вопрос о типизации, не забудь.
---
...Я работаю антинаучным аферистом...

ma3yp

> Запись всех выражений должна быть только инфиксной.
Это избыточное требование.
Иногда нужно иметь возможность работать с такими
операциями как с функциями от двух аргументов.
Например, как в приведённой здесь проге на haskell,
где (*) - префиксная запись инфиксной операции *
Это необходимое требование при обучении программированию.
Многие из здесь присутствующих обсуждая достоинства и недостатки языков программирования, кажется, забывают первоначальную постановку вопроса.

Chupa

>>> Запись всех выражений должна быть только инфиксной.
>> Это избыточное требование.
> Это необходимое требование при обучении программированию.
У языка, безусловно, должна быть естественная форма записи,
но требовать при этом отсутствие всех других совсем не обязательно.
А иногда и вредно.

ma3yp

Я и не требую отсутствия другой формы записи.
Простите, если я зря наезжаю на лисп из-за этого, я с ним не знаком. Просто слишком много примеров тут приводилось с префиксной записью.

Ivan8209

По этой науке я школьникам рассказывал только алгоритмику.
Без языков программирования.
Но у меня были другие школьники.
Сообщения об ошибках можно было бы перевести на русский.
Не знаю, правда, насколько это поможет.
Вот в лиспе есть только одна синтаксическая ошибка: лишняя скобка.
Ну, это так. Просто.
---
...Я работаю антинаучным аферистом...

Chupa

Вот именно на лисп наезжать и надо.
Я тут haskell пиарю.

Ivan8209

Просто префиксная запись --- естественная.
А про Reduce я только слышал, сам не сталкивался.
Перевели ли Reduce со Standard LISP на Common LISP, я не знаю.
---
...Я работаю антинаучным аферистом...

Ivan8209

Хаскелл как раз и не нужен.
Ты как будешь объяснять хотя бы те же отложенные?
Всё-таки, должен быть обычный язык.
В смысле времени вычисления.
---
...Я работаю антинаучным аферистом...

Marinavo_0507

Короче, у всех свои пристрастия.
Кому-то инфиксная запись самое главное, кому-то порядок вычислений.
Может, оно и у детей так же?

ma3yp

> По этой науке я школьникам рассказывал только алгоритмику.
> Без языков программирования.
Алгоритмика - это хорошо... Но без практики далеко не уедешь, нужно писать что-то сложное...
> Сообщения об ошибках можно было бы перевести на русский.
> Не знаю, правда, насколько это поможет.
Это отчасти поможет. Но только отчасти - некоторые школьники даже не пытаются прочесть сообщение об ошибке, как будто они его не замечают. Хотя, возможно, это все-таки чисто языковая проблема.
Теперь о переводе. "можно было бы"... Все можно было бы, но ни я, ни ты, ни автор этого треда заниматься этим не будет. А теперь скажи, для какого из всех перечисленных выше языков существует реализация с переводом на русский сообщений об ошибках?
Был, кажется, раньше Turbo Pascal такой, с просто похаченным бинарником. Редкостное извращение.

Marinavo_0507

Ещё мысль: а ведь придётся объяснять, что у всех этих например записей для факториала есть
нечто общее, как странно бы некоторые из них ни выглядели.
И если объяснить не получится, то едва ли можно сказать, что они научились программированию.
Может, сразу рассказать и немного показать про разные языки, а потом уже подробно про один?

ma3yp

> Короче, у всех свои пристрастия.
> Кому-то инфиксная запись самое главное, кому-то порядок вычислений.
> Может, оно и у детей так же?
Какие могут быть пристрастия у человека в области, в которой он ничего на знает? Какие пристастия мы в него впихнем, такие они у него и будут... Вопрос только - что впихивать проще?

Marinavo_0507

> Какие могут быть пристрастия у человека в области, в которой он ничего на знает?
А вот нифига.
Кто-то математические формулы ботал, и для него инфиксная запись понятнее.
А кто-то RPN-калькулятор имеет

ma3yp

Знаешь, Володя, я дописал к предыдущему сообщению еще один абзац, но потом стер до отправки.
Там я писал про то, что да, еще могут быть школьники уже с некоторыми вкусами. Ну таких немного.
Например, есть у меня один большой любитель Дельфей в 9 классе. Да, для своего 9 класса он Дельфи знает хорошо. Но объяснить ему, что невозможно прожить жизнь не программируя ни на чем, кроме Дельфей, я за 8 месяцев так и не смог.
Если человек работал с RPN-калькулятором (я только смутно догадываюсь, что может означать эта аббревиатура то это все-таки человек с ненулевой базой. Таких немного, речь не о них.

Marinavo_0507

RPN - польская запись.
Буржуи, говорят, до сих пор делают, ибо удобно.
У них внутри стек.
У меня были отечественные - БЗ-34, МК-61.
> Там я писал про то, что да, еще могут быть школьники уже с некоторыми вкусами.
Не во вкусах дело, со вкусами мало, согласен.
А дело в том, какой способ записи покажется естественным,
а это означает, наиболее похожим на что-то, что он умеет.
А это что-то может оказаться совершенно чем угодно, по моим представлениям.
Школа, говорят, математическая, поэтому для формул скорее всего инфиксная запись зарулит.
Но ведь есть ещё и функции, а там в математике принята префиксная запись.
А для собственно алгоритма - в школьной математике их не записывают - теряюсь в догадках.

ma3yp

> RPN - польская запись.
Об этом я и догадывался

Ivan8209

> ибо удобно.
> У них внутри стек.
Впишем ещё и Форт?
Есть замечательная методичка от Броуди.
---
...Я работаю антинаучным аферистом...

sany79

Почитаешь, да и решишь, что префиксная форма -- единственная достойная внимания фича Лиспа/Схемы. Какая разница? Мне кажется, для среднего человека она менее понятна, а для среднего транслятора более. Но ведь всё же для блага человека... В том же Прологе есть инфиксная запись, хоть она там и не очень вписывантся.
А я слышал, что есть ещё и некая Лямбда, таинственная и притягательная... Зачем она? Тот же факториал пишется и с ней, и без неё (даже короче).

Marinavo_0507

> Почитаешь, да и решишь, что префиксная форма -- единственная достойная внимания фича Лиспа/Схемы.
В случае Схемы имхо единственное, что достойно внимания - простота самого языка - минимум конструкций.
Соответственно - собственно программирование начинается раньше, чем при изучении других языков.
Про лиспы я ещё меньше знаю, но вроде они разные бывают.

ma3yp

Вот именно на лисп наезжать и надо.
Я тут haskell пиарю.
Посмотрел я документацию на Haskell, но вот в чем беда - все это не есть руководства, по которым можно учить школьников. Я могу учить школьников программированию на C, C++, Java, питоне, перле, паскале, бейсике, ruby, фортране, ... (не все из этого я знаю, но за неделю любой из них на достаточном уровне освоить можно ибо методика обучения везде будет одинаковой. Но вот тут предлагают перейти на функциональные языки. И я задаю вопрос - пожалуйста, не проблема, дайте мне методику обучения функциональному программированию для школьников, ибо я никогда не учил школьников функциональному программированию. Меня отсылают к разным руководствам, университетским курсам, но все это не то. Это все равно, что учить школьников началам анализа по Фихтенгольцу. Я знаю некоторых 9-классников, которые читают ВУЗовский курс матанализа, но большинству из них это не под силу. Можно работать по той же методике, что и с императивными языками - но зачем тогда изучать функциональные языки, исчезнет вся их изюминка. Можно попробовать создать свою методику - но для этого нужно сначала в совершенстве овладеть языком. Я этим заниматься не буду, не вижу в этом необходимости. Я изучаю язык программирования, если для этого есть необходимость. Например, я изучил Перл потому что понял, что это сэкономит мне массу времени. Я изучил Питон, чтобы использовать его в качестве инструмента обучения школьников по уже существующей методике обучения программированию.

Ivan8209

У Лиспа есть следующие преимущества:
а) единообразие программ и данных;
б) простота структур данных (списки) при всей мощности и естественности.
Префиксная запись --- это следствие двух вышеупомянутых.
Транслятор у Лиспа куда проще, чем у многих других языков.
Схема выделяется из Лиспов:
а) малым ядром;
б) продолжениями;
в) явно определёнными требованиями на хвостовую рекурсию;
г) более простыми правилами вычислений.
В Прологе префиксная запись совершенно не та.
В частности, нет единообразия программ и данных.
О какой "Лямбде" идёт речь?
---
...Я работаю антинаучным аферистом...

ma3yp

Да, открываю еще один козырь.
В Питоне есть лямбда-выражения.

Ivan8209

Ты книгу Эро Хювёнена и Йоуко Сеппянена "Мир Лиспа" видел?
---
...Я работаю антинаучным аферистом...

ma3yp

Нет, не видел.
Сейчас скачаю, посмотрю.

sany79

О той, которая lambda:


(define sqr (lambda (n) (* n n


или что-то в этом роде.

Marinavo_0507

Это всего лишь способ записать, а потом использовать функцию, не назначая ей имени.
Удобство.
Надеюсь, не забыл ни про какое фундаментальное отличие, отцы поправят если что.

Marinavo_0507

Если в питоне уже есть lexical scoping, то на нём можно писать в функциональном стиле.
На перле можно - я пробовал, успешно - но не очень удобно, система типов уродская.

sany79



(define fact (lambda (n) (if (< n 2) 1 (* n (fact (- n 1
(define (fact n) (if (< n 2) 1 (* n (fact (- n 1


Вроде второй пример короче... Может быть, если делать define, то так всегда будет, но при этом бывают ситуации, когда без лямбды неудобно?

ma3yp

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

Dasar

Есть фундаментальное отличие, внутри лямбды можно использовать локальные данные.
Синтаксис Лиспа не помню, но на C-ишном синтаксисе будет следующее:
Допустим у нас есть функция фильтрация, которая берет некую-функцию условие:


ICollection Filter (ICollection items, IsGoodHandler isGood)
{
ArrayList result = new ArrayList;
foreach (object item in items)
if (isGood(item
result.Add(item);
return items;
}


Понятно, что на одних функциях запрос вида, дай мне все объекты меньше данного - не сделаешь., потому что непонятно, как в функцию условие передавать параметры.
Вот здесь и приходит на помощь lamba


object currentItem = GetCurrentItem;
ICollection result = Filter(items, lamda(item) {item < currentItem});

Ivan8209

В случае сомнений, обращайся к стандарту.
Для Схемы он очень удобен.
http://schemers.org/Documents/Standards/R5RS/HTML/r5rs-Z-H-8.html#%_idx_190
---
"Курс истинно физической химии"

Marinavo_0507

На самом деле примерно так:
1. Запись функции и присваивание ей имени - разные вещи.
2. В функциональных языках функция - это полноправное значение.
3. Есть конструкция языка для связывания значения и имени, и есть конструкции для создания значений.
4. lambda - конструкция для создания значения типа функция, это и в перле, и в питоне есть.
5. Но, так как очень часто функции тут же присваивают имя, во всех этих языках для этого специальный синтаксис
вводят, который короче.
lambda удобно использовать, когда запись функции - часть выражения, а не оно целиком, как правило,
когда эта функция передаётся другой в качестве аргумента.
Например, надо возвести в квадрат каждый из элементов списка.
На ocaml:


let sqr_list l = List.map (fun x -> x*x) l


Или ещё короче:


let sqr_list = List.map (fun x -> x*x)


То же, но с именем для временной фунции:


let sqr_list =
let sqr x = x* x
in
List.map sqr



fun - это типа вместо lambda

Marinavo_0507

> Есть фундаментальное отличие, внутри лямбды можно использовать локальные данные.
Всегда можно.

CapitanJack

мегамысль! а может вам в программинг свалить отседава?

Ivan8209

Готовых методик обучения нет почти никогда.
Что же ты хочешь? Чтобы тебе всё на блюдечке принесли?
"Мир Лиспа" --- это одна из лучших книг, с удобным изложением.
С русским переводом.
Доступна.
http://lisp.org/alu/res-lisp-education
http://lisp.org/alu/res-lisp#scheme
---
...Я работаю антинаучным аферистом...

ma3yp

Сейчас просматривал некоторый русскоязычный курс лекций по Питону. Там приведен пример программы в две строчки с лямбда-выражениями, которая по данному n находит все простые числа, не превосходящие n.
После этого написано:
Потрясающе! Пользуйтесь приемами функционального программирования, и ваши программы будут мутны и нечитаемы!

Ivan8209

А слабо лямбдам дать имена?
---
...Я работаю антинаучным аферистом...

Dasar

> Всегда можно
Как?
Как, например, вышеприведенный пример с фильтром записать без lambda-ы?

Marinavo_0507

про простые числа

ma3yp

> Что же ты хочешь? Чтобы тебе всё на блюдечке принесли?
Да, конечно. Я же учитель, а не методист
А если серьезно, то есть два вопроса.
1. Я хочу оценить возможность обучения школьников функциональному и логическому программированию. Для этого я и хочу получить ссылки на существующие методики и опыт их применения.
2. Я хочу заняться обучением школьников функциональному и логическому программированию (в данный момент я рассматриваю это как факультативный курс для особо продвинутых). Но это требует от меня слишком больших затрат времени, поэтому я и спрашиваю о готовых методиках.
На самом деле, смайлик в начале даже излишен. Учителей, которые самостоятельно разрабатывают методики - единицы, потому что если каждый учитель занимался бы разработкой методики, то когда же он учить будет?

Ivan8209

fun sqr x = x*x;
let sqr_list = map sqr;
---
...Я работаю антинаучным аферистом...

Dasar

меня интересует фильтр, а не sqrt

Marinavo_0507



let filterList items =
let currentItem = getCurrentItem in
let filterFunc x = (x < currentItem) in
let result = List.filter filterFunc items
in
result

Dasar

Ок. Согласен. Был не прав, забыл, что можно функцию внутри функции объявлять.

Ivan8209

Можно подумать, что я методист.
Ссылок на готовые методики я не имею.
Могу только сказать, что логическое очень трудно понимается.
Я его пытался осилить и в школьные годы, и потом. Не получилось.
В отличие от функционального, которое пошло сразу и легко.
Возможно, что я что-то делал не так.
---
"...Надо учиться --- не напрягаясь!.." Акад. А. А. Бучаченко.

ma3yp

> Можно подумать, что я методист.
Но ты пытаешься рекламировать лисп как язык для обучения программированию с нуля. Я не нахожу твои аргументы убедительными. Тогда я понимая, что ты не являешься специалистом в области обучения Лиспу, прошу сослаться на опыт специалистов. Таких ссылок ты тоже не даешь. Какие я могу сделать выводы?

Ivan8209

Самоучкой он изучается легко.
Даже школьником.
А по поводу методик, напиши забугорным школьным учителям.
Наверняка у кого-то и мыло опубликовано.
---
...Я работаю антинаучным аферистом...

ma3yp

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

Ivan8209

Меня внесли в одну десятитысячную?
Лично я не вижу причин, по которым обучение тому же Лиспу
резко отличается от обучения хотя бы тому же Паскалю.
Только приёмы немного другие.
Ну, ещё интерпретатор доступен без отрыва от редактирования.
Есть программа обучения Паскалю или Сям?
---
...Я работаю антинаучным аферистом...

ma3yp

Я уж не знаю, на каком факультете ты учишься, но на этом факультете заведомо учится меньше одной десятитысячной населения России
У меня на полке стоит минимум три книги для школьников, посвященные программированию на Паскале или C, Одна - посвященная бейсику. Еще одна - задачник, не привязанный к конкретному языку, но подразумевающий именно императивный язык. Обучение всем этим языкам строится на одинаковых принципах с решением одинаковых задач. Структурирование материала всюду одинаковое: арифметика, условная инструкция, циклы, массивы, функции. А я вообще учу школьников Питону, хотя учебника по Питону у меня нет. Но он мне не нужен - питон ложится на эту же методику.
Если учить школьников лиспу - то нужны другие принципы, другое планирование курса, другая подборка задач. Потому что если использовать ту же методику, что и для императивных языков, то совершенно непонятно, в чем же прелесть функциональных языков и зачем их использовать.
Ладно, я спать пошел. До завтра

oleg_n

> Почтенные господа! Хотел бы увидеть мнения о пригодности
> Перла как языка для обучения программированию школьников
> с середины 9 класса до середины 11.
Короче.
Обучай чему хочешь/умеешь.
Тем кто поймёт, конечно, стоит сказать о "нормальных" (в любом смысле) языках,
но всем остальным будет по#$й. Девочки - для красоты, мальчики - просто, чтоб были.
Сможешь научить - молодец, не сможешь - ну и х$% с ним.
См. также ,
особенно
[это] получается всего лишь модельной задачей
для развития необходимых навыков, и вместо него здесь
вполне могло быть что-то другое (хотя, то, что у тренера
получается лучше всего, безусловно, предпочтительней).
//shurick, бухой shurick

sany79

Девочки - для красоты, мальчики - просто, чтоб были.
Сможешь научить - молодец, не сможешь - ну и х$% с ним.

Смогу. Просто чтоб были. Для красоты
Спасибо всем за обсуждение. Спровоцировал я недецкий флуд. Но всё равно интересно.

Kira

и всё-таки хотелось бы выслушать аргументы против java в инкарнации JBuilder'a. преимущества:
1. сначала побалуються с интерфейсными кнопочками - имхо setText('hello world'); гораздо выразительнее чем консольное hello world.
2. сразу будут приучаться к ООП.
3. прога будет автоматически приводиться к читабельному виду, и потом по аналогии школьники уже будут везде его применять.
4. будут сразу учиться не называть свои переменные aaa24, а - по человечески.
5. будут сразу (ну не на первом занятии, а вообще) учиться обрабатывать ексепшены.
то есть сразу (и почти на автомате) будут приобретать не просто знания по алгоритмам, но ещё и красивый стиль написания интерфейсных прог в современных средах.

ma3yp

> и всё-таки хотелось бы выслушать аргументы против java в инкарнации JBuilder'a.
Пожалуйста (поставил сейчас JBuilder8, немного с ним поигрался).
1. Высокая цена самого JBuilder, делающая невозможным его легальное использование. Что, смешно? А мне приходилось писать объяснительную записку на две страницы относительно того, почему у меня в компьютерном классе установлено неучтенное ПО. Кстати, выше произносились слова про Linux, но это будем считать незначительным аргументом.
2. > 1. сначала побалуються с интерфейсными кнопочками
RAD-среда не обязательно является Simple Application Development-средой. Сколько действий нужно выполнить, для того, чтобы создать "hello world" apllication и его запустить? Ты скажешь - легко, 5 щелчков мыши. Так вот, эти 5 щелчков мыши школьнику выполнить тяжело, потому что нужно знать, куда щелкать. Ты привык работать с этой средой, а школьники вообще никогда со средами разработки не работали, и если перед ними меню из 10 пунктов на английском, то им просто придется запоминать, куда щелкать. Большие проблемы будут.
Если уж брать RAD-среду, то лучше взять Visual Basic. Он проще: запустил программу - и сразу же формочка куда можно кнопочки пририсовывать.
При использовании RAD-среды возможна и другая проблема: исчезает ощущение того, что программа: это файл с последовательностью инструкций, начинает казаться, что программа - это то, что я тут мышкой навозюкал. А если смотреть на тот код, который сгенерировала RAD-среда, то в нем школьник просто потонет.
3. > сразу будут приучаться к ООП
А оно надо? Программирование на Java страдает теми же огрехами, что и программирование на С/C++: большое количество деталей, не имеющих отношения к алгоритму, на которые надо отвлекаться. Ты сможешь объяснить школьнику, что означает public static void main?
4. > будут сразу учиться не называть свои переменные aaa24, а - по человечески.
Это не факт. Кстати, школьники если уж и называют свои переменные по-уродски, то как правило просто одной буквой. Логика их проста: короткое название - простое название. И, кажется, пример среды разработки в этом их не переубедит.
5. > будут сразу (ну не на первом занятии, а вообще) учиться обрабатывать ексепшены.
Так сразу или все-таки не на первом занятии? Пока они поймут, что такое эксепшен, зачем и как его надо обрабатывать, пройдет много времени. А до того, как это время наступит излишние тонкости языка будут очень сильно отвлекать.
Вывод: одновременно обучать школьников одновременно алгоритмике и написанию интерфейсных прог в современных средах невозможно.

Aleksei66

После этого написано:
Потрясающе! Пользуйтесь приемами функционального программирования, и ваши программы будут мутны и нечитаемы!

Правильно. Потому что приемы функционального программирования на императивных языках выглядят ужасно.
Лямда - это всего лишь обозначение из лямбда-исчисления, на котором основаны функциональные языки. Употребление такой нотации в императивных языках не совсем правомочно, на мой взгляд, поскольку является по сути sintactic sugar, а не неотъемлимой частью языка, что может привести к путанице.

Aleksei66

Дело не в паре скобок и запятой.
Дело в том, что для выражения одного и того же действия есть две равносложных записи.
Причём используются обе эти записи, но часто непонятно из каких соображений.
Вот это неприятно.

Tuples нужны для удобного pattern matching, для создания сложных типов данных (Expr = Prod a*b | Null | ...) и для передачи из функций более одного значения. Это облегчает процесс программирования - не нужно возвращать списки, тем более, что в типизированном языке в список нельзя ложить разные элементы.

sergey_m

"Мир Лиспа" --- это одна из лучших книг, с удобным изложением.
С русским переводом.
Доступна.
http://lisp.org/alu/res-lisp-education
http://lisp.org/alu/res-lisp#scheme
занесено в FAQ

Ivan8209

> Структурирование материала всюду одинаковое:
> арифметика, условная инструкция, циклы, массивы, функции.
Функции, арифметика, условное выражение, рекурсия, списки.
Либо обменять порядок первых двух.
Задачки из тех же задачников могут подойти.
Возможно чуточку поработать напильником придётся
или отбросить неудобные.
---
...Я работаю антинаучным аферистом...

ma3yp

> Структурирование материала всюду одинаковое:
> арифметика, условная инструкция, циклы, массивы, функции.
Функции, арифметика, условное выражение, рекурсия, списки.
Задачки из тех же задачников могут подойти.
Возможно чуточку поработать напильником придётся
или отбросить неудобные.
Вот это уже более конструктивный подход к делу!
Ну ты сам видишь, что методика отличается? И с задачами все не гладко будет, они под изучение императивных языков заточены.

Marinavo_0507

> И с задачами все не гладко будет, они под изучение императивных языков заточены.
Ну вместо массивов учить спискам и деревьям, если задачи не расчётные.
На методику действительно было бы любопытно взглянуть.

Ivan8209

>>> арифметика, условная инструкция, циклы, массивы, функции.
>> Функции, арифметика, условное выражение, рекурсия, списки.
> Ну ты сам видишь, что методика отличается?
Методика отличается в обычную сторону.
Не заметил, что единственное, что изменилось,
это только увеличение веса именования выражений?
Это в классических ИЯ подпрограммы вводят в последнюю очередь.
Во всех приличных ЯП модульность более мелкая, чем в классических ИЯ.
Для сравнения, я уже приводил однострочный подход, ещё раз:
http://forthfreak.net/wiki/index.cgi?VIBE
Это радикально, непривычно, но впечатляет.
> И с задачами все не гладко будет,
> они под изучение императивных языков заточены.
Есть основания?
Я не вижу причин, по которым это должно быть так.
---
...Я работаю антинаучным аферистом...

ma3yp

>>>> арифметика, условная инструкция, циклы, массивы, функции.
>>> Функции, арифметика, условное выражение, рекурсия, списки.
>> Ну ты сам видишь, что методика отличается?
> Методика отличается в обычную сторону.
> Не заметил, что единственное, что изменилось,
> это только увеличение веса именования выражений?
Меняются то, на что опирается каждый последующий этап в изучении. Это очень серьезное изменение.
> Для сравнения, я уже приводил однострочный подход, ещё раз:
> http://forthfreak.net/wiki/index.cgi?VIBE
> Это радикально, непривычно, но впечатляет.
Посмотрел. Масса какого-то кода на непонятном языке. Что меня должно впечатлить?
Вопрос - это радикальное и непривычное можно изучить по стандартной методике?
>> И с задачами все не гладко будет,
>> они под изучение императивных языков заточены.
> Есть основания?
> Я не вижу причин, по которым это должно быть так.
Беру уважаемый учебник С.Окулова "Основы программирования". Открываю на главе с циклами:
* Для всех чисел от 1 до n найдите количество их делителей
* Выясните, представимо ли натуральное число n в виде суммы трех квадратов
* Найдите все представления числа n в виде суммы трех квадратов
* Найдите натуральное число меньшее 1000 с максимальной суммой делителей
* Найдите все простые числа в заданном интервале
* Найдите все пары дружественных чисел в заданном интервале
* В данном числе переставьте цифры так, чтобы образовалось наименьшее число, образованное этими цифрами
Решение каких из этих задач средствами функционального программирования записывается проще, чем средствами императивного?
Дальше есть глава про массивы, там задачки более подходящие, вроде найти наименьший элемент в массиве. Вот это уже легко записать через реккурсию. Но тут я подумал: научатся школьники такие задачи писать через реккурсию. Потом начнут писать на C, и будут искать наименьший элемент в массиве реккурентно Боже упаси!

Chupa

> Решение каких из этих задач средствами функционального
> программирования записывается проще, чем средствами императивного?
IMHO, всех.

Marinavo_0507

> Решение каких из этих задач средствами функционального программирования записывается проще, чем средствами императивного?
Однако, похоже, что всех
> Но тут я подумал: научатся школьники такие задачи писать через реккурсию.
> Потом начнут писать на C, и будут искать наименьший элемент в массиве реккурентно.
Увы, значит их не научили программировать.
Может, программирование - это всё-таки лишнее в школе, раз так сложно научить ему?

ma3yp

Решение задачи про представление числа в виде суммы трех квадратов - в студию!

Marinavo_0507

Можно вообще, но императивность там будет - так как чисто функциональный перебор с откатами -
это некий изврат.
Можно попробовать язык типа Mercury (там комбинируется функциональный и логический подход)
но я его не знаю в достаточной степени.
Попробую чуть попозже наваять функциональный код с элементами императивщины.

Chupa

Код решает задачу, хоть и не оптимален.
Объяснить его можно.


squares :: Int -> [Int]
squares n = filter (\a -> a*a < n) [1..n]
allSq :: Int -> [(Int,Int,Int)]
allSq n = [(x,y,z) | x<-sq, y<-sq, z<-sq, (x*x+y*y+z*z) == n] where sq = squares n
main = putStr (show (allSq 1000


результат:
[(6,8,306,30,88,6,308,30,610,18,2410,24,1818,10,2418,24,1024,10,1824,18,1030,6,830,8,6)]

ma3yp

Сможешь ли ты объяснить этот код на 10-м занятии?
Какое количество понятий языка будет использовать такой код?
Что должен знать школьник, чтобы понять этот код?

Marinavo_0507

Не оптимален - слабо сказано
Так и я умею

Marinavo_0507

> Что должен знать школьник, чтобы понять этот код?
Понятие списка и немного арифметики

ma3yp

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

Ivan8209

DK> арифметика, условная инструкция, циклы, массивы, функции.
K> Функции, арифметика, условное выражение, рекурсия, списки.
K> Методика отличается в обычную сторону.
K> это только увеличение веса именования выражений
DK> Меняются то, на что опирается каждый последующий этап в изучении.
DK> Это очень серьезное изменение.
Это обыкновенное изменение стиля программирования.
От классического к модульному.
Всё-таки, этому надо учить сразу,
а не дожидаться появления слов "(ре)факторинг."
K> Это радикально, непривычно, но впечатляет.
DK> Что меня должно впечатлить?
Малая модульность.
Любое определение выражает завершённое действие.
Это, кстати, ещё и хороший пример разработки "снизу вверх."
DK> Вопрос - это радикальное и непривычное можно изучить
DK> по стандартной методике?
Что ты называешь "стандартной?"
Ту первую, приводящую к "спагетти?"
См.http://www.forth.org.ru/forth/lit.html "Starting Forth."
> * Для всех чисел от 1 до n найдите количество их делителей
map
Проще.
> * Выясните, представимо ли натуральное число n в виде суммы трех квадратов
Хвостовая рекурсия.
Тоже обычно проще.
> * Найдите все представления числа n в виде суммы трех квадратов
Можно с map, можно напрямую через хвостовую рекурсию.
Проще.
> * Найдите натуральное число меньшее 1000 с максимальной суммой делителей
map, max, apply
Явно проще.
> * Найдите все простые числа в заданном интервале
filter
Явно проще.
> * Найдите все пары дружественных чисел в заданном интервале
Не помню, что значит "дружественные."
> * В данном числе переставьте цифры так, чтобы образовалось наименьшее число, образованное этими цифрами
Сходу не скажу, но если есть sort, то явно проще.
Написать сортировку слиянием труда не составляет.
Всё пишется через обычную хвостовую рекурсию, если про map и проч. не знаешь.
Можно и через обычные циклы написать, только надо ли?
Наименьшее в списке ищется с помощью (apply min your-list).
Не надо извращаться.
---
...Я работаю антинаучным аферистом...

ma3yp

> Понятие списка и немного арифметики
Значит, списки должны быть изучены раньше цикла?
Вот вам и кардинальная разница в методологии изучения языка.

Marinavo_0507

> Я сильно подозреваю, что через все эти значки школьнику продраться и нигде не ошибиться будет очень тяжело.
Примерное то же самое, что писать мат. формулы.
Есть что-то похожее на "олимпиадную" математику.

Ivan8209

Можно писать всё то же через рекурсию.
В современных лиспах она развёртывается в цикл "автомагически."
---
...Я работаю антинаучным аферистом...

ma3yp

DK>> Что меня должно впечатлить?
K> Малая модульность.
K> Любое определение выражает завершённое действие.
Меня это не может впечатлить, потому что я не знаю форта и не могу разобраться в этом коде. Для меня это выглядит сплошной абракадаброй. Тратить час на въезжание в этот текст я не могу.
K> map Проще
K> Хвостовая рекурсия. Тоже обычно проще.
K> map, max, apply Явно проще.
K> filter Явно проще.
K> если есть sort, то явно проще.
Таким образом, все эти задачи решаются просто, если школьник владеет полудюжиной других приемов функционального программирования. А в императивном программировании для решения этих задач нужно владеть только арифметикой, условием и циклом.
Напомню, речь шла о том, что подборка задач по тематикам императивного программирования не подходит для функционального программирования. В учебнике, откуда я их взял это все считается однотипными задачами.
K> Всё пишется через обычную хвостовую рекурсию, если про map и проч. не знаешь.
Это, кажется, уже будет изрядным извращением.
Вот это я и имел в виду - минимум имеющихся средств в императивном языке дает максимально широкий спектр решаемых задач. Именно поэтому они и доминируют.
K> Можно и через обычные циклы написать, только надо ли?
Не надо, потому что зачем тогда нужны функциональные языки.
Все это подтверждает мою идею, я говорю - вот задачи для обучения.
Ты говоришь - их проще решить фунциональным программированием.
Получается что да, проще, но не в процессе обучения, а только при наличии достаточно крутого уровня.
K> Наименьшее в списке ищется с помощью (apply min your-list).
K> Не надо извращаться.
Школьник должен сам уметь все делать руками, без вызова стандартной фунции. Это задача на технологию работы с массивом, а у тебя получается, что это задача на зубрежку стандартных функций. Программирование не есть заучивание стандартных функций.
Вот тебе и различие в методологии.

Chupa

> Не оптимален - слабо сказано
> Так и я умею
О средних школьниках вроде разговор.
Как они сумеют?

ma3yp

>Можно писать всё то же через рекурсию.
А это не убъет эффективность функционального языка?
Программист, который делает все через реккурсию - редкостное извращение.

Marinavo_0507

> Таким образом, все эти задачи решаются просто, если школьник владеет полудюжиной других приемов функционального программирования.
Это не приёмы, а функции стандартной библиотеки.
Их можно записать явно вначале (они все простые).
Либо не рассказывать сначала про стандартную библиотеку,
тогда конструкции из этих функций будут размазаны по коду.
> А в императивном программировании для решения этих задач нужно владеть только арифметикой, условием и циклом.
В фунциональном программировании соотв.: арифметикой, условием и рекурсией.
Циклы - это уже императивная фича.
Без рекурсии никак, естественно.
> Школьник должен сам уметь все делать руками, без вызова стандартной фунции.
> Это задача на технологию работы с массивом, а у тебя получается,
> что это задача на зубрежку стандартных функций. Программирование не есть заучивание стандартных функций.
Во всяких учебниках обычно сначала учат руками, а потом показывают, что вообще-то чтобы руками писать
поменьше, есть стандартная библиотека.

Marinavo_0507

> Программист, который делает все через реккурсию - редкостное извращение.
Вредное заблуждение, происходящее вследствии обучения только языкам, где рекурсия неудобна.
Хотя, вспоминая олимпиадное прошлое, даже на паскале очень часто помогало.
В переборных задачах - самое удобное средство.
В ФП рекурсия - одна из основных конструкций, правда, часто она не видна, так как находится
внутри библиотечных функций.

Chupa

> А в императивном программировании для решения
> этих задач нужно владеть только арифметикой, условием и циклом.
Неужели цикл объяснить проще, чем фильтрацию списка?
Первая конструкция явно искуственна и тут уже жаловались, что её не понимают.
Второе можно рассказать на пальцах.
Тем более в задачах вида "найти все, которые" фильтрация является естественным
способом решения: сначала поймём, среди чего искать, потом скажем что искать.

ma3yp

Приемы или функции - называете как хотите. В любом случае нужно объяснять, что такое map, что такое filter, что такое apply. Сколько это займет времени?
Спорим то о чем? Я говорю - что это другая методика обучения. Эти задачки для своего решения в императивном языке знания ни о каких особых стандартных функциях не предполагают. А тут - целый букет познаний предполагается.

Marinavo_0507

> А тут - целый букет познаний предполагается.
Не предполагается.
Это просто решения предъявили те люди, которые уже знают это.

ma3yp

>> Программист, который делает все через реккурсию - редкостное извращение.
>Вредное заблуждение, происходящее вследствии обучения только языкам, где рекурсия неудобна.
Угу. Я имел ввиду исключительно императивное программирование, с которым большинству школьников и придется потом работать в жизни независимо от нашего желания.
Еще раз напомню пример - приучили школьника к реккурсии. Он начинает писать на C (в университете, например) и находит наименьший элемент в массиве реккурсивно. Ужас!

Marinavo_0507

> Я говорю - что это другая методика обучения.
С этим я не спорю.
И на самом деле, я не понимаю, зачем учить именно какому-то языку.
Это путь подготовки обезьяноподобных кодеров, программированию
такому ученику придётся учиться каким-то другим образом.

ma3yp

> Неужели цикл объяснить проще, чем фильтрацию списка?
> Первая конструкция явно искуственна и тут уже жаловались, что её не понимают.
> Второе можно рассказать на пальцах.
Школьники, которые не понимают цикла, не поймут и фильтрацию.
Да и цикл можно на пальцах объяснить.
Я опять возвращаюсь к методологии. В обучении императивному программированию цикл - это средство работы с массивами. Сначала - циклы, потом - массивы. А у тебя получается использование списков без циклов в задачах, где явно напрашивается цикл в императивном программировании.
Ну что, разная методология или нет?

Marinavo_0507

> Я имел ввиду исключительно императивное программирование, с которым большинству
> школьников и придется потом работать в жизни независимо от нашего желания.
А придётся ли им программировать?
> Еще раз напомню пример - приучили школьника к реккурсии.
> Он начинает писать на C (в университете, например) и находит наименьший элемент в массиве реккурсивно. Ужас!
На мехмате например курс "программирования" - это LOL.
Если готовить именно к такому, то конечно, ФП идёт лесом.

ma3yp

> И на самом деле, я не понимаю, зачем учить именно какому-то языку.
> Это путь подготовки обезьяноподобных кодеров, программированию
> такому ученику придётся учиться каким-то другим образом.
Объясни: ты предлагаешь учить программированию вообще, а язык программирования - это средство и главное требование к языку - удобство в использовании и обучении, или ты предлагаешь вообще никаким языком не пользоваться в обучении программированию?

Ivan8209

DK>> Что меня должно впечатлить?
K> Малая модульность.
K> Любое определение выражает завершённое действие.
DK> Для меня это выглядит сплошной абракадаброй.
Тем не менее подход должен быть понятен.
Определение не должно вылезать за пределы обозримого пространства.
В ИЯ я такого не встречал, в отличие от ФЯ и Форта.
K> map Проще
K> Хвостовая рекурсия. Тоже обычно проще.
K> map, max, apply Явно проще.
K> filter Явно проще.
K> если есть sort, то явно проще.
DK> Таким образом, все эти задачи решаются просто, если школьник
DK> владеет полудюжиной других приемов функционального программирования.
DK> А в императивном программировании для решения этих задач
DK> нужно владеть только арифметикой, условием и циклом.
min, max --- это арифметика.
apply --- это основная операция, сродни присвоению.
Приёмов вообще только два: композиция и рекурсия.
Если надо, можно ещё ознакомить с накопителем.
Три.
Это вместо последовательного исполнения и циклов с подпрограммами.
И теми же накопителями.
DK> Напомню, речь шла о том, что подборка задач по тематикам
DK> императивного программирования не подходит для функционального
DK> программирования.
DK> В учебнике, откуда я их взял это все считается однотипными задачами.
Я не утверждал, что всё останется на своих местах.
Заметь, что в половине случаев, вместо циклов использована более простая композиция.
Устранены бесконечные циклы и неверные условия выхода.
K> Всё пишется через обычную хвостовую рекурсию,
K> если про map и проч. не знаешь.
DK> Вот это я и имел в виду - минимум имеющихся средств
DK> в императивном языке дает максимально широкий спектр
DK> решаемых задач. Именно поэтому они и доминируют.
Минимум --- это ерунда.
Можно всё построить на одной операции, только кому это надо.
Я бы посмотрел, как ты объяснишь, что всё можно сделать на марковских.
DK> Все это подтверждает мою идею, я говорю - вот задачи для обучения.
DK> Ты говоришь - их проще решить фунциональным программированием.
DK> Получается что да, проще, но не в процессе обучения,
DK> а только при наличии достаточно крутого уровня.
Я не проверял, ты не проверял... С чего ты решил, никто не знает.
Сомнительные сведения, в лучшем случае.
K> Наименьшее в списке ищется с помощью (apply min your-list).
K> Не надо извращаться.
DK> Школьник должен сам уметь все делать руками,
DK> без вызова стандартной фунции.
* --- это не стандартная функция?
А "/"?
(min a1 a2 a3 ... an) --- это точно такая же функция, как и сложение или умножение.
DK> Это задача на технологию работы с массивом, а у тебя получается,
DK> что это задача на зубрежку стандартных функций.
Это плохая задача для обработки списков.
Это задача на композицию, а не на списки.
Задача на списки --- это написание своего mapcar, foldr, filter, map и т.п.
---
...Я работаю антинаучным аферистом...

ma3yp

> А придётся ли им программировать?
Исходим из того, что это матклассы, то есть будущие математики, то есть придется.
Курс информатики в общеобразовательной школе мы вроде бы как не обсуждаем, там, конечно, все надо по-другому делать.

Ivan8209

Хвостовая рекурсия развёртывается внутри.
Ты мне покажи математика, который всегда пишет
"a_1 + a_2 + \ldots + a_n" вместо "\sum\limits ..."
Или который определяет числа Фибоначчи исключительно через алгоритмику.
Всю жизнь встречал только рекурсивные определения.
---
...Я работаю антинаучным аферистом...

Marinavo_0507

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

Ivan8209

map f : (a1,..., an) -> (f(a1..., f(an
apply f: (a1,...,an) -> f(a1, ..., an)
filter p: (a1, ..., an) -> (a1', ..., am' где p(ak')!=nil или p(ak')= #t для всех k.
---
...Я работаю антинаучным аферистом...

Chupa

>> Неужели цикл объяснить проще, чем фильтрацию списка?
>> Первая конструкция явно искуственна и тут уже жаловались, что её не понимают.
>> Второе можно рассказать на пальцах.
> Школьники, которые не понимают цикла, не поймут и фильтрацию.
> Да и цикл можно на пальцах объяснить.
У школьников уже есть какое-то бытовое представление о том,
что такое список и что такое фильтр. И это согласуется с понятиями
языка. А про цикл они ещё не знают.
Получается некая совсем абстрактная сущность,
которую необходимо усвоить и научиться узнавать.
> Я опять возвращаюсь к методологии. В обучении императивному
> программированию цикл - это средство работы с массивами.
> Сначала - циклы, потом - массивы. А у тебя получается использование
> списков без циклов в задачах, где явно напрашивается
> цикл в императивном программировании.
А что напрашивается у школьников, которые ещё не владеют ИЯ,
и которые не видят в этих задачах циклов и массивов?
> Ну что, разная методология или нет?
Разная, с этим никто не спорит.

ma3yp

> min, max --- это арифметика.
Это не арифметика. Арифметика - это +, -, *, /
> Я не утверждал, что всё останется на своих местах.
Выше ты утверждал, что не видишь причин, почему подборка задач для изучения императивных языков подходит для изучения функциональных. Подборка задач - это не только их суммарное множество, но и некоторая классификация. А так то конечно - если одним языком задачу решить, то и другим можно.
K> Я не проверял, ты не проверял... С чего ты решил, никто не знает.
K> Сомнительные сведения, в лучшем случае.
Вот поэтому я и хочу ссылку на методику.
(min a1 a2 a3 ... an) --- это точно такая же функция, как и сложение или умножение.
Да, но только в C и Pascalе - ее нет. А в питоне я запрещаю школьникам ею пользоваться, пока сами не напишут ее реализацию.

Marinavo_0507

> Исходим из того, что это матклассы, то есть будущие математики, то есть придется.
Имхо нормальный математик легко разберётся в разных парадигмах программирование.
И будет использовать то, что удобнее, а не то, что придётся.
Я пытался писать в функциональном стиле на C ЧМ, когда даже не знал, что ФП бывает.
Очень помогло - моя программа короче других, и написал я её быстрее.
А я - ненастоящий математик, только по диплому.

Ivan8209

> В обучении императивному программированию цикл -
> это средство работы с массивами.
> Сначала - циклы, потом - массивы.
То есть, сначала --- массивы, а уже потом --- циклы.
Не так ли?
Сначала, с чем работаем ("зачем" а потом чем работаем ("что делать").
> А у тебя получается использование списков без циклов в задачах,
> где явно напрашивается цикл в императивном программировании.
map, fold, filter --- это цикл, с точки зрения ИЯ.
---
...Я работаю антинаучным аферистом...

ma3yp

> А что напрашивается у школьников, которые ещё не владеют ИЯ,
> и которые не видят в этих задачах циклов и массивов?
Если они не владеют никаким программированием вообще, то перебор у них напрашивается.
Возьмем задачу про представление в виде суммы трех квадратов.
Взяли слагаемое 1. Проверили.
Взяли слагаемое 2. Проверили.
Взяли слагаемое 3. Проверили.
Это что? Список или цикл?

ma3yp

DK> В обучении императивному программированию цикл -
DK> это средство работы с массивами.
DK> Сначала - циклы, потом - массивы.
K> То есть, сначала --- массивы, а уже потом --- циклы.
K> Не так ли?
K> Сначала, с чем работаем ("зачем" а потом чем работаем ("что делать").
С дидактической точки зрения ты не прав. Массивы без циклов в императивном языке бессмысленны, поскольку нет средств работы с ними. Поэтому сначала нужно вводить циклы, закреплять их усвоение задачами вроде приведенных, потом вводить массивы.

Ivan8209

>> min, max --- это арифметика.
> Это не арифметика. Арифметика - это +, -, *, /
Сравнение чисел считаются у тебя арифметикой?
>> Я не утверждал, что всё останется на своих местах.
> Выше ты утверждал, что не видишь причин,
> почему подборка задач для изучения императивных языков подходит
> для изучения функциональных.
Там ещё было замечание про напильник.
> Подборка задач - это не только их суммарное множество,
> но и некоторая классификация.
Большая часть задач на циклы покрывается композицией.
Очень много вещей делаются простыми map, fold, apply, filter.
> Вот поэтому я и хочу ссылку на методику.
Я тебе указал список школ.
Это, вообще-то, считается ссылкой.
Напиши преподавателям.
> Да, но только в C и Pascalе - ее нет.
Там много чего нет.
Можно сказать, почти ничего нет.
> А в питоне я запрещаю школьникам ею пользоваться,
> пока сами не напишут ее реализацию.
Ну так пусть и напишут mapcar, map, filter и foldr.
Тогда и min с max будут.
---
...Я работаю антинаучным аферистом...

ma3yp

K> min, max --- это арифметика.
DK> Это не арифметика. Арифметика - это +, -, *, /
K> Сравнение чисел считаются у тебя арифметикой?
Арифметика - это действия над числами. min и max для списка - это действие над группой чисел, то есть уже не то.
K> Там ещё было замечание про напильник.
Если ты имел в виду напильник, которым из танка самолет делают, то я не хочу быть таким напильником.

Ivan8209

DK> В обучении императивному программированию цикл -
DK> это средство работы с массивами.
DK> Сначала - циклы, потом - массивы.
K> То есть, сначала --- массивы, а уже потом --- циклы.
K> Не так ли?
K> Сначала, с чем работаем ("зачем" а потом чем работаем ("что делать").
DK> С дидактической точки зрения ты не прав.
Сейчас выясним.
DK> Массивы без циклов в императивном языке бессмысленны,
DK> поскольку нет средств работы с ними.
Что мешает тройки чисел обозначать именно как A(1 A(2 A(3
а не A1, A2, A3?
А если брать тройку как естественное отображение множества {1, 2, 3} куда-то там?
DK> Поэтому сначала нужно вводить циклы,
DK> закреплять их усвоение задачами вроде приведенных,
DK> потом вводить массивы.
Опять же.
Все те же задачи можно решать и прямым способом: рекурсивно.
---
...Я работаю антинаучным аферистом...

Ivan8209

K> Сравнение чисел считаются у тебя арифметикой?
DK> Арифметика - это действия над числами.
DK> min и max для списка - это действие над группой чисел,
DK> то есть уже не то.
Складывать и умножать можно сразу много.
"Сложить всё" естественно понятно.
K> Там ещё было замечание про напильник.
DK> Если ты имел в виду напильник, которым из танка самолет делают,
DK> то я не хочу быть таким напильником.

Нет, требуются небольшие доработки.
---
...Я работаю антинаучным аферистом...

ma3yp

Ну вот, ты пытаешься придумать новую методологию.
А я говорил про принятую методологию обучения императивным языкам, где цикл идет до массивов по-любому.
О том, чтобы кто-то обучая школьников программированию на императивном языке сначала вводил понятие массива, а потом уже - цикла, я не слышал.

ma3yp

Надоела мне эта дискуссия: в последнее время я из нее не узнал ничего нового.
Да и делом пора заняться.
Заодно поздравляю нас с разведением самого большого флуда за всю историю H&S!
(или раньше такой флуд в H&S просто быстро сносился в мусорку?)

Chupa

Как ученик предлагает делать генератор слагаемых?

Ivan8209

Рекурсию тоже надо объяснять раньше списков --- один чёрт, на самом деле.
Ладно.
Это уже не H&S, если обратил внимание.
---
...Я работаю антинаучным аферистом...

ma3yp

А в этом есть некоторая сермяжная правда!
python code:
for i in range(n):
где range(n) - это список. Цикл for в Питоне невозможен без списка, обязательно надо указать список, значения из которого принимает переменная.
Питон - рулит! Надо будет в будущем году рассказать школьникам про цикл for до цикла while.
Типа, мы тут родили методологическую находку про то, как нужно вводить циклы в Питоне. Спасибо!

Marinavo_0507

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


let sq_3 n =
(* Вывести все представления n в виде суммы трёх квадратов *)
let rec try_all_squares min maxs f =
(* перебрать все такие x, что min<=x и x*x<=maxs,
для каждого x вызвать фунцию f (императивщина!) *)
if min*min > maxs
then
else
begin
f(min);
try_all_squares (min+1) maxs f;

end
in
let sq_2 x1 =
(* попробуем x1 в качестве первого числа *)
let n1 = n - x1*x1 (* остаток *) in
let sq_1 x2 =
(* попробуем x2 в качестве второго числа *)
let n2 = n1 - x2*x2 in
(* если n2 = x3*x3, где x3>=x2 , то вывести решение *)
let rec try_x3 x3 =
let x3_2 = x3*x3 in
if x3_2 > n2
then
else if x3_2 = n2 then
begin
(* нашли решение *)
print_int x1;
print_char ' ';
print_int x2;
print_char ' ';
print_int x3;
print_newline
end else try_x3 (x3+1)
in
try_x3 x2 (* начинаем проверять, начиная с x2 *)
in
try_all_squares x1 n1 sq_1
in
try_all_squares 1 n sq_2
;;
sq_3 1000;;


Выводит

6 8 30
10 18 24

Ivan8209

То есть, всё-таки, списки раньше циклов?
---
...Я работаю антинаучным аферистом...

Ivan8209

Хм.
Пойду и я что-нибудь сваяю.
---
...Я работаю антинаучным аферистом...

ma3yp

В случае с Питоном, я думаю, это надо делать так.
Арифметика.
Условия.
Цикл for и одновременно простейшие списки, создаваемые функцией range (то есть арифметические прогрессии). Список вводится как множество, значения из которого принимает переменная в цикле.
Цикл while
Списки как таковые.
Раньше я рассказывал про while раньше for. Но в Питоне цикла for не бывает без списка, так что в любом случае нужно упоминать про списки, когда говоришь про цикл for.

Ivan8209

Вот чёрт!
E-Lisp всё-таки своеобразный Lisp.
Даже map нет.
А ещё и глаза разбегаются, каким способом делать.
---
...Я работаю антинаучным аферистом...

Marinavo_0507

А теперь - вернёмся к сабжу.
Этот же алгоритм - на Perl, буквальный перевод, только в одном месте хак пришлось
придумывать - там комментарий:


use strict;
sub try_all_squares {
my ($min, $maxs, $f) = @_;
if ($min*$min <= $maxs) {
&$f ($min);
try_all_squares ($min+1, $maxs, $f);
}
}
sub sq_3 {
my $n = shift;
my $sq_2 = sub {
my $x1 = shift;
my $n1 = $n - $x1*$x1;
my $sq_1 = sub {
my $x2 = shift;
my $n2 = $n1 - $x2*$x2;
my $try_x3_ref = \( sub { die ""; } );
# А как ещё в перле рекурсивную анонимную функцию сделать?
my $try_x3 = sub {
my $x3 = shift;
my $x3_2 = $x3*$x3;
if ($x3_2 == $n2) {
print "$x1 $x2 $x3\n";
} elsif ($x3_2 < $n2) {
&$$try_x3_ref ($x3+1);
}
};
$$try_x3_ref = $try_x3;
&$try_x3 ($x2);
};
&try_all_squares ($x1, $n1, $sq_1);
};
&try_all_squares (1, $n, $sq_2);
}
&sq_3 (1000);


Итак, вердикт: сабж - ОК

Ivan8209

В общем, не E-Lisp.
Scheme:


(define (sqr n) (* n n
(define (delta n a b c) (- n (apply + (map sqr (list a b c
(define (factored-p n a b c) (= 0 (delta n a b c
(set! empt '
(define (corr n a b c)
(cond
> (sqr c) n) empt)
> a b) (corr n 1 (+ 1 b) c
> b c) (corr n 1 1 (+ 1 c
(#t (list n a b c
(define (next n a b c)
(if (number? n) (corr n (+ 1 a) b c) empt
(define (domain n a b c)
(if (number? n)
(cons (list n a b c) (apply domain (next n a b c
'
(define (filter p lst)
(if (null? lst) lst
(let x (filter p (cdr lst
(if (p (car lst (cons (car lst) x) x
(define (fctr-p l) (apply factored-p l
(define (main n) (map cdr (filter fctr-p (domain n 1 1 1


---
...Я работаю антинаучным аферистом...

loks-po

Я прочел весь тред от начала и до конца.
У меня возникло чувство, что необходимо удалить его полностью, заменив глубоким анализом всего сказанного... статью нужно.
А также захотелось выбросить компьютер в окно и застрелиться.
Пошел отсоединять провода.
Баклажанам бой.

sany79

Застрелиться и выбросить -- это дело. А удалять-то зачем? Этак можно и Форум удалить, заменив глубоким анализом
А то сколько больших и интересных тем было -- и никто не удалял. "Несколько вопросов к...", скажем. "Каррент Мурзик". (Где-то сейчас Мурзик? Самый настоящий?..) Или про что-то ЧОРНОЕ...
Анализ и статью можно сунуть, когда будут готовы, прямо сюда. Очень любопытно.

Marinavo_0507

Решил написать более культурно, со списками, и получилось,
что проще оказалось искать суммы не трёх квадратов, а произвольного числа!
Вот это уже пожалуй на Си-подобных языках посложнее будет.
Кроме того, насчёт необходимости императивных конструкций для этой задачи
я погорячился, функция чистая.


let sq k n =
(* найти все представления n в виде k квадратов *)
let rec get_all_sq m =
let m2 = m*m in
if m2 > n then []
else (m, m2)::(get_all_sq (m+1
in
let all_sq : (int*int) list = get_all_sq 1
(* здесь у нас список пар вида (m, m*m где 1 <= m*m <= n *)
in
let rec sq_k k m2list x =
(* найти все представления х в виде суммы k квадратов
из списка m2list *)
match (k, x) with
| (0, 0) -> [[]]
| (0, _) -> []
| _ ->
(* остался случай k > 0 *)
let k1 = k-1 in
let rec sq_k1 (m2list : (int*int) list) x : int list list =
(* для случая k>=1 перебираем все пары из m2list,
для которых m2 <= x *)
match m2list with
| [] -> []
| (m, m2)::t ->
if m2>x then []
else
(* попробуем пару (m, m2) *)
let s1k1 : int list list = sq_k k1 m2list (x-m2)
(* это список всех разложений (x-m2) на k1 квадратов *)
in
let s1k : int list list = List.map (fun l -> m::l) s1k1
(* это мы к каждому разложению приписали в начало m *)
in
List.append s1k (sq_k1 t x)
(* объединили список для m и для больших него квадратов *)
in
sq_k1 m2list x
in
sq_k k all_sq n


sq 3 1000 выдаёт:
[[6; 8; 30]; [10; 18; 24]]

Dasar

> Вот это уже пожалуй на Си-подобных языках посложнее будет
Вот оно же на C#-е.
Перебор последовательностей C из n по k, оформил в виде отдельного класса Permutations, чтобы его можно было использовать и в других задачах


class Class1
{
static void Main(string[] args)
{
int n = 1000;
int k = 3;
List<int> squareRoots = GetSquareRoots(n);
List<List<int>> results = new List<List<int>>
foreach (Permutation permutation in new Permutations(squareRoots.Count, k
{
List<int> sequence = new List<int>
foreach (int index in permutation)
sequence.Add(squareRoots[index]);
int sum = 0;
foreach (int item in sequence)
sum += item;

if (sum == n)
{
results.Add(sequence);
}
}
//output
foreach (List<int> result in results)
{
foreach (int item in result)
Console.Write(Math.Sqrt(item).ToString + " ");
Console.WriteLine;
}
}
static List<int> GetSquareRoots(int n)
{
List<int> squareRoots = new List<int>
for (int i = 1; ; ++i)
{
int square = i * i;
if (square > n)
break;
squareRoots.Add(square);
}
return squareRoots;
}
}
public class Permutation: List<int> { }
public class Permutations: IEnumerable
{
public Permutations(int n, int k)
{
this.k = k;
this.n = n;
}
int n;
int k;
static int GetChangeableIndex(Permutation permutation, int max)
{
for (int i = permutation.Count - 1; i >= 0; --i)
{
if (permutation[i] < max - 1)
return i;
max = permutation[i];
}
return -1;
}
static Permutation NextPermutation(Permutation permutation, int max)
{
int index = GetChangeableIndex(permutation, max);
if (index == -1)
return null;
permutation[index] = permutation[index] + 1;
for (int i = index; i < permutation.Count - 1; ++i)
{
permutation[i + 1] = permutation[i];
}
return permutation;
}
static Permutation FirstPermutation(int k)
{
Permutation result = new Permutation;
for (int i = 0; i < k; ++i)
result.Add(i);
return result;
}
IEnumerator System.Collections.IEnumerable.GetEnumerator
{
for (Permutation permutation = FirstPermutation(k); permutation != null;
permutation = NextPermutation(permutation, n
yield permutation;
}
}

Marinavo_0507

> Перебор последовательностей C из n по k, оформил в виде отдельного класса Permutations
Алгоритм другой получился - перебор без отсечений.
У меня отсечение происходит, когда частичная сумма больше n:
if m2>x then []
И GetChangebleIndex каждый раз массив permutations заново проходится сначала,
в то время как при рекурсивном переборе этот индекс хранится в стеке вызовов.
В общем, точно не перебор с откатом, как мои программы, а другой алгоритм.
И программа заметно сложнее
Правда, зато у меня список из частей склеивается, что несколько неэффективно.

Marinavo_0507

А что за конструкция yield?
Какая-то магия?
Надеюсь, она превращает цикл в ленивый поток?

Dasar

> А что за конструкция yield?
> Какая-то магия?
Да, магия.
> Надеюсь, она превращает цикл в ленивый поток?
Не знаю, что такое "ленивый поток", но думаю, что ты правильно понял.

Marinavo_0507

А как магия работает?
Типа co-routine создаётся со своим стеком, и yield переключает контекст?

Dasar

> Типа co-routine создаётся со своим стеком, и yield переключает контекст?
Да, примерно, так.

ZaAp

Давайте посмотрим в глаза действительности. Perl -не настоящий язык программирования. То есть на нем например можно писать удобные скрипты для анализа текста, для быстрых стандартных функций, но область его применения не выходит за рамки деятельности сисадмина и начинающего веб-программиста. Попытки начать учить школьников изначально неправильному стилю ,сродни ситуации, когда в Советском Союзе поголовно всех учили Бейсику и до сих пор все пишут функции по 100 строк по логике "goto". Реально платформы под которые ведется коммерческая разработка две и все их знают. Поэтому либо Java (JBuilder если уж очень нужен в легкой версии бесплатный либо С и клоны. Хотя возможно мне всё это показалось на примере около десятка крупных top100 российских IT компаний и как гуру программирования может привести примеры крупных хотя бы трехуровневых MVC разработок на Перле.

sany79

Наверное, многое из написанного здесь справедливо. Но всё же непонятно, что значин "не настоящий язык программирования". Вроде в Перле всё на месте -- и переменные, и управляющие конструкции.
В Советском Союзе изучение Бейсика было вынужденной мерой -- приличные языки (вроде Ерша) не были реализованы для имеющихся в школах компьютеров (Агаты, БК, МК во многих школах компьютеров не было вовсе. С распространением IBM PC XT, AT ситуация с преподаванием информатики в школах изменилась.
Я не ставил перед собой задачу и не имею такой возможности готовить промышленных программистов. И буду вынужден огорчить моих учеников: после моего курса они не будут готовы к работе в ведущих IT-компаниях. Но что за беда? Поступят в университет, научатся, если захотят, слава богу. Подготовка таких специалистов предполагает изучение многих языков программирования. Мне кажется, специалист, привязанный к какому-то конкретному средству разработки, пусть даже очень популярному, через некоторое время станен неактуальным и нафиг никому не нужным. Такой специалист напоминает специально обученную обезьяну.
Ещё когда я начинал эту тему, считал, что изучение нескольких характерных языков (C/C++, Lisp Prolog) возможно и уместно в школе -- если позволяют часы. Но часов немного, и классы не специализированные информатические. Придётся чем-то пожертвовать.
Согласен, что программы на Перле не всегда самые эффективные и самые быстрые. Но это заранее оговаривается, и это не есть недостаток языка. Если это недостаток, то скорее компилятора. К тому же, "писать удобные скрипты для анализа текста" и т. п. мне представляется важным.
Возможно, перл непригоден для решения какого-то класса промышленных задач. Но наши задачи учебные, а не промышленные. Да и вообще это не довод против изучения какого-нибудь языка в школе. Я так думаю.

buka

Создается мнение, что большинство осуждающих Перл не читали книгу его создателя...
Перл выделяется из многих естественностью, он, в отличие от большинства ЯП, ориентирован не на машину или мат. модели, а на человека. И язык этот довольно универсален, особенно в системах, основанных на текстовом общении.
Особенно важными для молодого ума мне кажутся такие аспекты:
1. нет излишних поначалу обязательных конструкций типа "#include "stdio.h" int main(void) {return 0;}" или "program sux; begin end;"
2. вездесущее автовыделение памяти, а значит легкое объявление переменных
3. жесткие и символические ссылки(указатели) и наличие удобных базовых структур данных @ и %
4. присутсвие типа в имени переменной ($calar, @rray, %, &)
Жаль, что его не преподавали в моей школе, так же как и unix... У меня, лично, нет сомнений, что это подходящий учебный язык для СШ.

ZaAp

Когда-то мне в СУНЦе один преподатель сказал такую вещь: образование должно быть расчитано с тем условием, что область его применения будет 10-20 лет спустя. Прошло семь лет... Мне сейчас никаким ..не уперлись извращенные алгоритмы сортировки в великом множестве, а также с какого адреса начинается видеопамять в досе. Профессиональных программистов не готовят и в ВУЗах, хотя пытаются. Потом когда они хотят стать программистами,они заново САМИ учатся, и учатся не конкретному языку, а основам, без которых никуда нельзя. При нехватке времени при обучении вначале можно забыть даже про различные типы переменных и скока они занимают, и что раньше выполняется с++ или ++с, но объясните, что такое класс, как от него получить объект и вызвать его метод. Я вижу будущее в том, что скоро напишут все возможные функции и реализуют удобные парсеры и способы хранения данных(XML тому пример нужно будет просто вызывать готовые методы из готовых продуктов (зачем изобретать велосипед?). И тут приходит Вася, вышколенный на извращенных учебных задачах, который с самого начала загорится воссоздать всё то прикладное ПО которое до него сотни человек писали -тестировали, но не то, чтобы не знает его - это не страшно; он не знает даже как использовать шаблоны(паттерны по которым можно представлять их использование. И здесь его знания генетических алгоритмов и семантических особенностей языков, остановившихся в развитии на уровне 80-ых годов никому не нужны.

ZaAp

Я как-то пару лет назад встречался с человеком (забыл фамилию автором русских книг по перлу и прочим php. Произвел очень трезвое впечатление и я не думаю, что он представляет себе начальное обучение программированию именно на нём.

Marinavo_0507

Аргумент - супер.
"Какой-то дядя (несколько книжек написал, наверное умный, вот только фамилию его не помню
наверное не одобрил бы такое дело"

sergey_m

перлу и прочим php
Я не вижу ничего общего между этими языками.

sergey_m

Современному IT меньше 10 лет. А уж 20 лет назад все было совсем по другому. Каждый год направления IT пересматриваются, и наверное корректируются учебные программы в разных учебных учреждениях. Ты думаешь, что ты сможешь предсказать тенденции развития IT и предсказать смерть перла в ближайшие скажем 7 лет? И то, что выживут 20 лет твои любимые языки?

solteron

Когда-то мне в СУНЦе один преподатель сказал такую вещь: образование должно быть расчитано с тем условием, что область его применения будет 10-20 лет спустя. Прошло семь лет... Мне сейчас никаким ..не уперлись извращенные алгоритмы сортировки в великом множестве, а также с какого адреса начинается видеопамять в досе.
Это невозможно, пока что не научились предсказывать будущее
Самые современные и актуальные вещи через 10 лет могут стать той же "видеопамятью в досе".
Кстати, как того преподавателя в СУНЦе звали? Страна должна знать героев

Chupa

> Это невозможно, пока что не научились предсказывать будущее
> Самые современные и актуальные вещи через 10 лет могут стать той же "видеопамятью в досе".
Зато lisp и lambda calculus никуда не денутся.

buka

Уж не Гущин ли это был (при молчиливом участии Шкафа)?

Ivan8209

> Создается мнение, что большинство осуждающих Перл,
> не читали книгу его создателя...
Зато видели перлы в действии.
> Перл выделяется из многих естественностью,
Что в нём естественного?
> он, в отличие от большинства ЯП, ориентирован не на машину
> или мат. модели, а на человека.
Объясни.
> И язык этот довольно универсален, особенно в системах,
> основанных на текстовом общении.
Лисп тоже универсален.
> 3. жесткие и символические ссылки(указатели)
За одно это его можно убить.
> и наличие удобных базовых структур данных @ и %
Если он естественный, то почему я не понимаю, что обозначается "@" (выборка числа из ячейки памяти?) и что обозначается "%" (такого вообще нет и никогда не было).
> 4. присутсвие типа в имени переменной ($calar, @rray, %, &)
И за одно это его можно убить.
Почему человек должен быть обязан писать тип переменной, если он и так знает, что "list" --- это список?
> Жаль, что его не преподавали в моей школе, так же как и unix...
> У меня, лично, нет сомнений, что это подходящий учебный язык для СШ.
Тебе тоже надо читать Пайка.
---
...Я работаю антинаучным аферистом...

buka

> Что в нём естественного?
> Объясни.
Читать книжку Ларри. В двух словах -- там конструкции языка приближенны к конструкциям языков естественных. Есть понятия единственного и множественного числа (скаляры и списки глаголов (операторы и функции принадлежности (ассоциативные массивы). Его идеология -- "делай то, что я имею в виду". Код пожно сделать похожим на человеческую речь, а не на мат. формулы.
>> И язык этот довольно универсален, особенно в системах,
>> основанных на текстовом общении.
>Лисп тоже универсален.
Перл -- повелитель текстов, так что если все общение в среде основано на текстовых сообщениях (консольное управление, настройка через аргументы вызова а большая часть настроек хранится в текстовом виде, то этот язык, в плане организации взаимодействия и использования готовых решений, воистину всесилен.
>> 3. жесткие и символические ссылки(указатели)
>За одно это его можно убить.
А по-моему, очень остроумно.
>Если он естественный, то почему я не понимаю, что обозначается "@" (выборка числа из ячейки памяти?) и что обозначается "%" (такого вообще нет и никогда не было).
>Почему человек должен быть обязан писать тип переменной, если он и так знает, что "list" --- это список?
Если ты действительно не понял, то @ -- "Array", а $ --"Scalar". Знать тебе никто не мешает, а читать удобней -- это факт.

Ivan8209

>> Что в нём естественного?
>> Объясни.
> В двух словах -- там конструкции языка приближенны
> к конструкциям языков естественных.
> Есть понятия единственного и множественного числа (скаляры и списки
> глаголов (операторы и функции
> принадлежности (ассоциативные массивы).
> Его идеология -- "делай то, что я имею в виду".
Это обычные слова, можешь их никогда не писать,
только если говоришь с совсем уж неразбирающимся человеком.
> Код пожно сделать похожим на человеческую речь, а не на мат. формулы.
С постоянным указанием типа?


NPX EXCEPTION OVERFLOW DISABLE
ROUNDING TO -INF


Можешь определить что-то такое, чтобы писать вот так?
Писал лично --- работает.
> Перл -- повелитель текстов
Ты считаешь, что ни у Лиспа, ни у МЛ-ов не может быть строковой библиотеки?
>>> 3. жесткие и символические ссылки(указатели)
>> За одно это его можно убить.
> А по-моему, очень остроумно.
Это "остроумие" называется временем связывания.
Это говорит только о твоём опыте общения с разными языками.
>> Если он естественный, то почему я не понимаю, что обозначается "@"
>> (выборка числа из ячейки памяти?) и что обозначается "%"
>> (такого вообще нет и никогда не было).
> Если ты действительно не понял, то @ -- "Array", а $ --"Scalar".
Отлично, "@" --- это "at," а "$" --- это знак доллара.
После этого вспоминаем о заявленной приближенности к "человеческому."
Так сделано, чтобы ввести в заблуждение?
>> Почему человек должен быть обязан писать тип переменной,
>> если он и так знает, что "list" --- это список?
> Знать тебе никто не мешает, а читать удобней -- это факт.
Что удобней читать?
Постоянно мельтешащие знаки "@", "$", "#", "%"?
Объясни, почему PERSONS --- это не массив и не список?
Почему надо писать "@PERSONS"?
Названия переменной не хватает?
---
...Я работаю антинаучным аферистом...

Akuri

хитрожопых алгоритмов

рыдал...

buka

Я так понял, ты считаешь себя большим отцом языков программирования и слышать ничего не хочешь.
Вот это:
>> А по-моему, очень остроумно.
> Это "остроумие" называется временем связывания.
>> @ -- "Array", а $ --"Scalar".
> Отлично, "@" --- это "at," а "$" --- это знак доллара. После этого вспоминаем о заявленной приближенности к "человеческому."
уже совсем невпопад.
Пытаясь избежать твоей истерии, я полностью признаю тебя вышеобозначенным отцом и смиренно умолкаю, благо к теме разговора последние реплики отношения уже не имеют.

Dasar

Использование $ и @ в именах переменных - это фактически венгерская нотация. Есть мнение, что венгерская нотация мешает при написании сложных программ.

sergey_m

Использование $ и @ в именах переменных - это фактически венгерская нотация. Есть мнение, что венгерская нотация мешает при написании сложных программ.
А регулярные выражения - полная хуйня, потому что их очень тяжело читать. А самый зыкий язык Logo, потому что на нем могут программировать первоклассники.

Dasar

Регулярные выражения действительно тяжело читаются.
В регулярных выражениях делается очень много ошибок.

sergey_m

Я хотел сказать, что читаемость языка не может служить мерилом его качества. Более того, читаемость это очень и очень субъективное понятие. Например есть перцы, которые программу на C начинают вот так:


#define begin {
#define end }


Я не испытываю проблем с синтаксисом perl (кстати префиксы переменных не самое помороченное в синтаксисе). Я приспособился быстро читать RE. Но разобраться в синтаксисе Lisp я не могу. Я думаю, что дело в отсутствии практики, поэтому не кричу что Lisp - ацтой.
Есть такие языки, которые не могут быть реализованы с лучшей читаемостью. Например RE. Приходится мириться с этим, потому что нельзя отказаться от возможностей RE только из-за трудночитаемости.

freezer

А самый зыкий язык Logo, потому что на нем могут программировать первоклассники.

с первого класса не слышал этого слова!

Ivan8209

> Я хотел сказать, что читаемость языка
> не может служить мерилом его качества.
Спорное утверждение.
Кто-то уже приводил выдержку со словами "syntax matters."
> Более того, читаемость это очень и очень субъективное понятие.
Она ещё и зависит от способа записи.
Ты же приводил ссылку на style(9)?
В Лиспе всё просто --- только списки.
Поэтому можно сказать, что синтаксиса там (почти) нет.
По поводу регулярных выражений можно сказать такое:
а) они в простых случаях в общем виде не нужны;
б) в сложных случаях лучше, если будут писаться сразу образцы,
например, набодобие Snobol-овских.
---
...Я работаю антинаучным аферистом...

ma3yp

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

Smaug

Приходите ко мне работать педагогами (учреждение дополнительного образования детей).
Курс по информационным технологиям рассчитан на 3-4 года. Возраст детей - 7-10 классы.
Из языков программирования большим споросом пользуется Паскаль (5 ч. в неделю). - изучают на втором году обучения
Но педагог вправе сам выбрать учебную нагрузку и предмет обучения. Одним из важных
моментов: заинтересовать детей (у них есть выбор идти изучать ту или иную
область).

sany79

Спасибо, но, боюсь, не потяну ни третью ставку, ни четвёртое место работы.

Ivan8209

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

ддд

Массово обучать средних детей программированию надо на легком для начального освоения языке, синтаксис которого более или менее похож на синтаксис наиболее массовых ЯП.

Причем, легкость освоения здесь даже важнее.

Под эти требования более всего подходят Бэйсик, Пайтон, Паскаль.

Тем, кто хочет/может изучать программирование сверх школьной программы уже можно либо экзотику вроде всяких Схем и Лиспов, либо более трудные языки - Си, Яву, Си++ и так далее. Вместе с тем, таких детей лучше ориентировать либо на олимпиадное, либо на профессиональное программирование. А там тоже Лиспов и Схем практически нет. То есть, получается, что им лучше осваивать наиболее распрастраненные ЯП.
Оставить комментарий
Имя или ник:
Комментарий: