>Т.е. одной строчкой (через какой-нибудь генератор классов) создать
класс сразу с набором методов и задать (без всякого наследования).
а в рубби тут Struct разве не базовый класс? в перле есть модуль struct который похоже себя ведет. только в одну строку не вместится, потому что use будет второй строкой.
>Но в перле чё плохо что стандартные типы не объекты т.е. Почему когда мне нужно узнать длинну массива я должен извращаться типа scalar @{$blah->list} вместо $blah->list->lenght ?
ну это во многих языках так. в том же C++ int тоже не объект.
а в твоем примере ты уж имеешь ссылку на объект. вот и определи в нем метод length :)
А вместо классов исключений (типа Exception->StandardError->ArithmeticError->ZeroDivisionError) использовать сообщения, которые потом распарсивать? Нет уж, спасибо.
>да, в практически любой либе с cpan :)
Видел только в двух библиотеках - одна для распарсивания конфигурационных файлов, вторая - интерфейс к MySQL (причем там оно по дефолту отключено). А вот писать после каждого действия (типа открытие файла и т. д.) or die ну совсем не в кайф.
Всякие языки разметки, наверное, тоже могут считаться декларативными. Пролог был бы наверняка декларативным, если бы на side effects нельзя было играть.
> Ну, при желании - конечно. Но у людей нет такого желания. Не считают его таким языком, и баста :)
Тем не менее макросы вполне могут предоставить средства декларативного программирования, довольно тривиальным способом. То, что макросы генерят код, дающий ответ, а не непосредственно ответ как в декларативных - дело вобщем-то десятое. Вспомни ту же реализациб пролога на лиспе, скоко она там занимает?
А труъ это совсем не ООП, а то, что удобнее для конкретной задачи. Какие есть в руби способы вычислить булево значение выражений наподобие (a < b <= c == d) по принятым в арифметике правилам?
Скриптование - это выполнение сценария, просто поочерёдное выполнение операторов одного за другим. Программирование - это постановка задачи в терминах языка программирования (в первую очередь!) и последующее её решение в этих же терминах. Очевидно, что всякую задачу можно свести к выполнению некоего сценария, и также совершенно очевидно что для большинства задач это самый нелепый и неэффективный способ их решения. Скриптовые наречия, такие как башскрипт, классический бейсик или питон дают возможность выполнения сценария, но их способность к неимперативным конструкциям или мала или вообще отсосутствует. Из других парадигм в них подразумевается как максимум ООП в минимальном варианте, как форма записи императивного алгоритма. Применение любых других парадигм или составление своих затруднено либо вообще невозможно. Вся хоть сколько-нибудь сложная функциональность выносится во внешний мир, в библиотеки как в питоне или исполняемое как в башскрипте. Средства автоматической генерации кода отсосутствуют напрочь, логика более сложная чем оператор switch тоже, и что самое главное, средства для создания этого тоже отсутствует.
выглядит жутковато, согласись? В "фразе о лиспе" глянь как это просто и изящно можно сделать на коленке с нуля и полученый результат вполне вписывается в остальную прогу.
Не читал признаться, слишком длинно. Но если что-то типа (multicmp a < b <= c), то различия чисто синтаксические. Сам же говоришь, что спорить о том, где } а где end не имеет смысла.
Вообще, было бы прикольно добавить в руби возможность доопределять любые операторы, как в хаскелле. :) Хотя так ли это надо - вопрос.
> Практически ни с чем не согласен, но твою точку зрения понял.
А с чем именно?
> являются ли Бейсик, Паскаль и Си скриптовыми языками? Под вышеприведенное описание они тоже подпадают.
Си непопадает, средств у него довольно дофуа. А их некоторая недостаточность связана низкоуровневостью, жоскими требованиями быстродействия и возможности "оптимизации вручную", и вообще, ты бы в этой компании ещё асм бы вспомнил, вот где скриптование процветает :D. В предыдущем я имел в виду только достаточно высокоуровневое, если ты не понял. Классический пасцаль - это недойазыг (недоси), в хорошем смысле этого слова. Он не предполагался для практического использования, а только для обучения. То, что на ём пытались делать продакшн проекты, говорит о том, что нужно учиться пользоваться микроскопом для рассмотрения мекробов, а не пытаться делать это при помощи молотка сперва. Иначе "привыкнеш, и твоя жысь не будет стоить ломаного цента" (С) самизнаетечёй. Современные породы пасцаля - это недойазыги в худшем смысле этого слова. Они недостаточно высокоуровневы для прикладного программирования и недостаточно низкоуровневы для системного. Бейсик - он и предназначен был для "создания простых программ непрофессиональными программистами", выражаясь по-теперешному, скриптования.
> Не читал признаться, слишком длинно.
Зря, там много забавных мест, хоть и мусора тоже.
> Но если что-то типа (multicmp a < b <= c), то различия
> чисто синтаксические.
Вот, я вытащил оттудова. Интересно было бы глянуть
на аналогичную функцию в варианте руби.
----------------------------------------
(defun cmp (x)
(if (= 1 (length x))
t
(and
(eval (list (second x) (first x) (third x)))
(cmp (rest (rest x))))))
пример юсажа:
[2]> (cmp '(2 = 2 <= 4 = 4 < 5 < 6))
T
[3]> (cmp '(2 = 2 <= 4 = 4 < 5 < 3))
NIL
----------------------------------------
> Сам же говоришь, что спорить о том, где } а где end не имеет смысла.
Да, но тут уже речь идёт не о разных вариантах написания, } или end,
а о наличии бесполезых, не несущих необходимой смысловой неагрузки,
и : и их отсутствии.
> Вообще, было бы прикольно добавить в руби возможность
> доопределять любые операторы, как в хаскелле. :)
Речь не совсем об операторах в математическом смысле,
их добавлении к имеющимя или убирании лишних,
а о возможности более гибко адаптировать программу
к области задачи. Здесь например, легко и непринуждённо
используются в общем несвойственные лиспу инфиксные.
Я могу скормить аналогичное выражение любой длины этой функции,
и оно легко будет записано и легко будет читаться. А представь
череду из десятка a, :<, ... в руби-варианте?
> Хотя так ли это надо - вопрос.
Если как в с++, ИМХО луче не надо.
Это всё понятно, в этом месте руби действительно не очень расширяем, но на практике очень часто можно обойтись и тем, что у него уже есть. Там метапрограммирование тоже имеется, хотя и несколько неполноценное, но для рельсов хватило например. :)
> ОК, Паскаль не попадает из-за низкого уровня, понятно.
В классическом виде он по духу всётаки ближе к бейсику чем к сям.
> Если следовать твоему определению, то да.
Я просто забыл указать что каждый из операторов в скриптовом языке несёт довольно сильно адаптированную к человечемкому восприятию смысловую нагрузку. В случае с бейсиком это арифметические выражения или например функции рисования точек/линий, в случае с башем - потоки и файлы етц.
>> Си непопадает, средств у него довольно дофуа.
> какие такие средства у Си?
Макросы например, получше чем в питоне :P. Возможность динамического кода при помощи указателей на функции. Скудные возможности ООП, благодаря им же.
Кстати, нафига у тебя там (cmp '(...))? Ещё несколько строчек, и делаем из этого макрос, как я и написал (cmp ...). Мы не сторонники полумер. :) Причём аргументы этого макроса даже и вычислять не будем, если одно из сравнений левее уже обломилось - всё как в лучших домах лондона и парижа. :)
> Это всё понятно, в этом месте руби действительно не очень расширяем, но на практике очень часто можно обойтись и тем, что у него уже есть. Там метапрограммирование тоже имеется, хотя и несколько неполноценное, но для рельсов хватило например. :)
Всё правильно, на практике часто можно обойтись башскриптом, или bc/gnuplot/другим специализированным, или десятком строк на бейсике. Зависит от задачи. Питоном можно обойтись, если для этого случая уже библиотеку к нему понаписали, соединить вместе несколько кусков готового кода, с этим он в принципе справится, хотя и плохо но для большинства случаев "пойдёт и так". Джангой можно обойтись, если времени и клавиатуры не жалко, или даже виндовсем с дотнетиненадой, кто-то ведь обходится. Помниш про дельфибыдлокодера, перемещающего льва в клетку? "Спрашивает форумах, где скачать компоненты 'лев' и 'клетка', если никто не отвечает - говорит что задача не решаема". Если на практике очень часто можно обойтись готовыми, а неготовые никто вобщем-то неспрашивает, ну и ладно. Всё так, да. Не так давно мне один доказывал что дотнетиненадо - это необычайно круто "патамушта я работаю ф крутой фирме и мне доверили мышом таскать контролы на формы. Получается приложение и его продают закащщику за бешеное бабло!". Доказывать ему что есть задачи, которые не решатся даже если все контролы, существующие в этой маленькой жалкой грязной вселенной на свою формочку стащит, они не решатся? Дык он не поверит, не сумеет поверить. А если поверит, то только расстроится и больше никакого результата не будет. Оно нам надо? Хм, тога уж луче возможность переопределять операторы в хаскель добавить. Это тоже бесполезно, но хотябы забавно.
Вся эта эскапада ничего не меняет в моих словах. :) У каждого языка - своя область применения, и писать на лиспе find . -ls |sort -nr +6.0 |head -30 я не стану, например. :) И руби - неплохой компромисс. Им могут пользоваться люди довольно простые, но вместе с тем он достаточно мощный и расширяемый для широкого класса задач. В общем спорим уже ни о чём...
Это передаётся в функцию cmp список из элементов, составленный по определённым правилам. Элементы списка - последовательность значений, разделённая функциями сравнения. Кстати, как дополнительный бонус, даваемый динамической типизацией, есть возможность скормить этой функции произвольные типы и функции сравнения, например (cmp '("a" string= "b"))
> Ещё несколько строчек, и делаем из этого макрос, как я и написал (cmp ...)
Можно и так. Но макрос не всегда хшё ибо чтобы он развернулся параметры должны быть вычислены на этапе компиляции, а в моём случае сприсок '(a = b < c ...) может быть скормлено функции, будучи например вычислен по ходу работы проги или скачано работающей прогой откуда-нибудь с инета, а в коде представлено как (cmp (download-list "http://linux.org.ru/users-count.ucw")). Во вторых, несомненно есть кучя способов сделать такое же, и многие наверняка лучше, но я понаписал эту функцию исключительно спинным моском исключительно для разовой цели и не счёл полезным уделять время для её обдумывания и оптимизации.
> У каждого языка - своя область применения, и писать на лиспе find . -ls |sort -nr +6.0 |head -30 я не стану, например
Дык я и не возражаю, я же сказал - всё правильно.
> И руби - неплохой компромисс. Им могут пользоваться люди довольно простые, но вместе с тем он достаточно мощный и расширяемый для широкого класса задач.
Конечно. Пока можно палкой выковырять фкусные корешки, найденные в лесу по запаху, зачем браться за соху?
> В общем спорим уже ни о чём...
Хм, а на ЛОР когда-то было по-другому? я недавно в топике про моск участвовал, дык вообще гика убеждал что его, гика, несомненно не бывает. Убедил, изчез гик :|
Хм, на редкость странная идея. Зачем бы ему давать жене такое распоряжение, чтобы она не пущала его к компу, если он сам хотел к нему подойти? А если не хотел, зачем подходил, так что жене пришлось его отгонять?