Сказка о насильниках, приплюснутых насильниках, о переносимости и о том, чего не покажут проверки.
кг/ам
типа вот:
типа вот:
x = s & 0xFFFFFFFFUL;
if (x == 0) {
x = 1;
}
это вообще, к чему? пишем x=1 и всё. x у тебя никогда не будет 0. при чём здесь s?
Оно обязано быть.
Таковы условия.
---
...Я работаю антинаучным аферистом...
Таковы условия.
---
...Я работаю антинаучным аферистом...
Молодец.
Теперь объясни, почему насильники не могли написать сразу
правильно.
Кстати, сможешь на взгляд определить,
что за число такое 2147483646?
---
...Я работаю антинаучным аферистом...
Теперь объясни, почему насильники не могли написать сразу
правильно.
Кстати, сможешь на взгляд определить,
что за число такое 2147483646?
---
...Я работаю антинаучным аферистом...
1111111111111111111111111111110_2
> Теперь объясни, почему насильники не могли написать сразу
> правильно.
А я доктор?
> правильно.
А я доктор?
А 2145483479?
А 1103515245?
И что?
Прямо так, на взгляд?
---
...Я работаю антинаучным аферистом...
А 1103515245?
И что?
Прямо так, на взгляд?
---
...Я работаю антинаучным аферистом...
M-x doctor?
Как-то не тянешь.
Тебе надо больше тренироваться.
Да, в одном-двух местах насильник написал действия в верном порядке.
Опечатался, наверное.
---
...Я работаю антинаучным аферистом...
Как-то не тянешь.
Тебе надо больше тренироваться.
Да, в одном-двух местах насильник написал действия в верном порядке.
Опечатался, наверное.
---
...Я работаю антинаучным аферистом...
2^31 (2147483648) и 2^32 (4294967296) слишком часто попадались на глаза - я их запомнил.
эти два на взгляд не определяются.
эти два на взгляд не определяются.

а зачем здесь " & 0xfffffffUL"?
Да, я чуть упростил задачу.
Если бы я сразу выложил число 4194302,
которое 2^22-2, было бы посложнее.
Немного объяснений.
Числа вида 2^31-2, 2^22-2 возникают закономерно,
как наибольшие в соответствующих кольцах вычетов.
А вот другие два числа подбираются "так, чтобы."
Выводы.
---
...Я работаю антинаучным аферистом...
Если бы я сразу выложил число 4194302,
которое 2^22-2, было бы посложнее.
Немного объяснений.
Числа вида 2^31-2, 2^22-2 возникают закономерно,
как наибольшие в соответствующих кольцах вычетов.
А вот другие два числа подбираются "так, чтобы."
Выводы.
---
...Я работаю антинаучным аферистом...
Также я не понял, при чем здесь "насильники"?
Или ты хочешь сказать, что на Java, Basic-е, shell-е, ML-е, Haskel-е или на чем-то еще данная задача автоматически была бы решена правильно?
Или ты хочешь сказать, что на Java, Basic-е, shell-е, ML-е, Haskel-е или на чем-то еще данная задача автоматически была бы решена правильно?
Ты будешь смеяться, но вот так эти извращенцы берут остаток от
деления на 2^n.
---
...Я работаю антинаучным аферистом...
деления на 2^n.
---
...Я работаю антинаучным аферистом...
т.е. в условии задачи еще входит, что переменная s должна быть обрезана до 4 байт?
Да, на МЛе задача, почти наверняка, была бы решена сразу
правильно.
Потому что в МЛ можно определить, если его ещё нет,
возведение в степень, и ускорением взятия остатка от деления
занимается, по договорёности, не человек.
---
...Я работаю антинаучным аферистом...
правильно.
Потому что в МЛ можно определить, если его ещё нет,
возведение в степень, и ускорением взятия остатка от деления
занимается, по договорёности, не человек.
---
...Я работаю антинаучным аферистом...
Не до "четырёх байт," а впихнуто в подтип "INTEGER range 0..2**32."
---
...Я работаю антинаучным аферистом...
---
...Я работаю антинаучным аферистом...
> Потому что в МЛ можно определить, если его ещё нет,
> возведение в степень, и ускорением взятия остатка от деления
> занимается, по договорёности, не человек.
Но как это поможет? т.е. что мешает программисту на ML-е сначала проверить на ноль, а потом взять остаток от деления?
> возведение в степень, и ускорением взятия остатка от деления
> занимается, по договорёности, не человек.
Но как это поможет? т.е. что мешает программисту на ML-е сначала проверить на ноль, а потом взять остаток от деления?
> Не до "четырёх байт," а впихнуто в подтип "INTEGER range 0..2**32."
Почему об этом ничего не написано в оригинальном условии задачи?
Почему об этом ничего не написано в оригинальном условии задачи?
Потому что задача ставится не "построить мост вот по этим
чертежам," а "построить такой мост."
---
...Я работаю антинаучным аферистом...
чертежам," а "построить такой мост."
---
...Я работаю антинаучным аферистом...
Культура программирования.
---
...Я работаю антинаучным аферистом...
---
...Я работаю антинаучным аферистом...
> Культура программирования.
И что это такое?
Хочешь сказать, что если завтра новичка посадить за ML - он эту самую культуру магическим способом выучит?
ps
Замечу, что доля новичков на C много больше, чем новичков в ML-е
И что это такое?
Хочешь сказать, что если завтра новичка посадить за ML - он эту самую культуру магическим способом выучит?
ps
Замечу, что доля новичков на C много больше, чем новичков в ML-е
> Хочешь сказать, что если завтра новичка посадить за ML - он эту самую культуру магическим способом выучит?
Сразу не получится. Мне тут недавно сказали, что сначала нужно чакры открыть.
Сразу не получится. Мне тут недавно сказали, что сначала нужно чакры открыть.
Нет.
Но МЛ, сам язык не способствует, если не препятствует
программированию с ранними низкоуровневыми "хаками"
в расчёте на скорость исполнения.
Код, кстати, выставляется на профессиональном уровне.
Если б он был учебным, то разговор шёл бы иначе.
---
...Я работаю антинаучным аферистом...
Но МЛ, сам язык не способствует, если не препятствует
программированию с ранними низкоуровневыми "хаками"
в расчёте на скорость исполнения.
Код, кстати, выставляется на профессиональном уровне.
Если б он был учебным, то разговор шёл бы иначе.
---
...Я работаю антинаучным аферистом...
> Код, кстати, выставляется на профессиональном уровне.
На выставке, что ли?
На выставке, что ли?
Предназначен для профессионального продукта.
---
...Я работаю антинаучным аферистом...
---
...Я работаю антинаучным аферистом...
Тогда ничего удивительного.
> Но МЛ, сам язык не способствует, если не препятствует
> программированию с ранними низкоуровневыми "хаками"
> в расчёте на скорость исполнения.
т.е. ты хочешь сказать, что если запись была бы высокоуровневой:
то ошибка опять же магическим способом исчезла бы?
> программированию с ранними низкоуровневыми "хаками"
> в расчёте на скорость исполнения.
т.е. ты хочешь сказать, что если запись была бы высокоуровневой:
if (s == 0)
s = 1;
x = mod(s, pow(2, 32;
то ошибка опять же магическим способом исчезла бы?
Такой ошибки можно было бы избежать только на языках, поддерживающих контракты:
Вот при наличие такого контракта, компилятор или с помощью "размышлений", или с помощью "тестов" мог бы "увидеть" ошибку.
unsigned long transform(unsigned long s) contract result != 0
{
if (s == 0)
s = 1;
return s & 0xFFFFFFFFUL;
}
Вот при наличие такого контракта, компилятор или с помощью "размышлений", или с помощью "тестов" мог бы "увидеть" ошибку.
Ещё к вопросу о переносимости.
Часто встречаемый образец.
Сможете сходу догадаться, что делает подобная ворожба?
---
...Я работаю антинаучным аферистом...
Часто встречаемый образец.
#define AAA NNN_1
#define MMM NNN_2
#define RRR NNN_3
#define QQQ NNN_4
<Тут много какого-то текста с фигурными скобками>
long int Y = X;
long int R = RRR * (Y / QQQ);
Y = AAA * (Y % QQQ) - R;
if (Y < 0)
Y += MMM;
X = Y;
Сможете сходу догадаться, что делает подобная ворожба?
---
...Я работаю антинаучным аферистом...
Смотря в каком контексте данный код используется.
Имея только эти голые формулы - ни о чем более высокоуровневом, чем сами эти формулы, ничего сказать нельзя.
Имея только эти голые формулы - ни о чем более высокоуровневом, чем сами эти формулы, ничего сказать нельзя.
Решил замещать Глебиуса - учись подбирать заголовки.
Вот примеры:
Вот примеры:
Во-первых, приличный структурный программист сразу бы выделил
вот это самое действие (Да, пожалуй, я слишком сильно порезал,
знание области существования переменных Y и R необходимо. в
отдельную подпрограмму.
Это отображение X -> (A*X) mod M.
Числа Q и R подбираются отдельно (делением M на A).
Заметьте, что их значения _вбиваются_. Дословно.
То есть, доцифренно.
И это вместо обыкновенных M)/(A и M)%(A соответственно.
Причём удвоение разрядности машины (чем чёрт не шутит?) приводит
к бесполезности подобных вывертов.
Кстати, рядом же насильник описывает функции,
как "static inline unsigned int."
Какого чёрта врисовывать эту функцию вручную?
---
...Я работаю антинаучным аферистом...
вот это самое действие (Да, пожалуй, я слишком сильно порезал,
знание области существования переменных Y и R необходимо. в
отдельную подпрограмму.
Это отображение X -> (A*X) mod M.
Числа Q и R подбираются отдельно (делением M на A).
Заметьте, что их значения _вбиваются_. Дословно.
То есть, доцифренно.
И это вместо обыкновенных M)/(A и M)%(A соответственно.
Причём удвоение разрядности машины (чем чёрт не шутит?) приводит
к бесполезности подобных вывертов.
Кстати, рядом же насильник описывает функции,
как "static inline unsigned int."
Какого чёрта врисовывать эту функцию вручную?
---
...Я работаю антинаучным аферистом...
"приличный структурный программист сразу бы выделил вот это самое действие"
Вот видишь: ты сам себе ответил, т.е. это зависит не от языка, а зависит от того - является ли программист - структурным или не является.
Вот видишь: ты сам себе ответил, т.е. это зависит не от языка, а зависит от того - является ли программист - структурным или не является.
Ты хочешь сказать, что Си не является структурным?
---
...Я работаю антинаучным аферистом...
---
...Я работаю антинаучным аферистом...
Основная роль C - "кроссплатформенный ассемблер", поэтому то, что в C есть элементы структурного программирования - погоды не делает.
ps
Структурно писать можно и на Asm-е, а неструктурно хоть на прологе.
ps
Структурно писать можно и на Asm-е, а неструктурно хоть на прологе.
Да ничерта он не "кроссплатформенный ассемблер."
Был бы он "кроссплатформенным," у него был бы
или, на худой конец
а не вышеописанное умножение "unsigned long int"-ов на месте
или размещение 48-разрядных двоичных чисел в трёх
"unsigned short int"-ах, которые могут в один прекрасный день
оказаться вдвое короче, чем надо.
Кстати, про структурное программирование на Прологе расскажи.
А то я как-то плохо представляю себе, что это такое.
---
...Я работаю антинаучным аферистом...
Был бы он "кроссплатформенным," у него был бы
subtype THAT_DAMN_INTERVAL is INTEGER range 0..2**32;
или, на худой конец
DCL X BINARY(32);
а не вышеописанное умножение "unsigned long int"-ов на месте
или размещение 48-разрядных двоичных чисел в трёх
"unsigned short int"-ах, которые могут в один прекрасный день
оказаться вдвое короче, чем надо.
Кстати, про структурное программирование на Прологе расскажи.
А то я как-то плохо представляю себе, что это такое.
---
...Я работаю антинаучным аферистом...
> subtype THAT_DAMN_INTERVAL is INTEGER range 0..2**32;
Если такое добавить, то на тех компьютерах, на которых такого нет, придется делать эмуляцию.
Что же это будет за ассемблер - если он требует для работы "эмулирующую прослойку".
Если такое добавить, то на тех компьютерах, на которых такого нет, придется делать эмуляцию.
Что же это будет за ассемблер - если он требует для работы "эмулирующую прослойку".
Так на то и существуют компиляторы!
В противном случае люди писали бы на связке as+m4,
а не на cc+cpp.
Встроить арифметику большей точности, чем имеющаяся
разрядность,--- это не такая уж большая забота.
Вон, на К580-ых есть плавающая запятая и ничего.
Никто от этого не умер.
---
...Я работаю антинаучным аферистом...
В противном случае люди писали бы на связке as+m4,
а не на cc+cpp.
Встроить арифметику большей точности, чем имеющаяся
разрядность,--- это не такая уж большая забота.
Вон, на К580-ых есть плавающая запятая и ничего.
Никто от этого не умер.
---
...Я работаю антинаучным аферистом...
Очередная КОНТРАатака на С++... В чем же причина? Вот глава из известной книги.
Позволил себе отметить курсивом, на мой взгляд, важный для понимания отрывок.
Дао С++
С++ — язык, который изучается постепенно. Лишь после того, как будет сделан последний шаг,
разрозненные приемы и фрагменты синтаксиса начинают складываться в общую картину. По-моему,
изучение С++ чем-то напоминает подъем на лифте. Дзынь! Второй этаж. С++ — это
усовершенствованный вариант С, с сильной типизацией (которую, впрочем, при желании можно
обойти) и удобными комментариями //. Любой программист на С, если он не хочет подаваться в
менеджеры, должен двигаться дальше… а Бьярн Страуструп (Господи, благослови его) придумал для
этого отличную возможность.
Дзынь! Третий этаж. С++ — хороший, хотя и не потрясающий объектно-ориентированный язык
программирования. Не Smalltalk, конечно, но чего ожидать от языка, работающего с такой
головокружительной скоростью? С++ — это Cobol 90-х, политически выдержанный язык, которые
гарантирует финансирование вашего проекта высшим руководством. А уж если С++ достаточно часто
упоминается в плане, можно надеяться на удвоение бюджета. Это тоже хорошо, потому что никто
толком не умеет оценивать проекты на С++ и управлять ими. А что касается инструментария — глаза
разбегаются, не правда ли?
Дзынь! Последний этаж, все выходят. Но позвольте, где же «все»? Лифт почти пуст. С++ — это на
самом деле не столько язык, сколько инструмент для создания ваших собственных языков. Его
элегантность заключается отнюдь не в простоте (слова С++ и простота режут слух своим явным
противоречием а в его потенциальных возможностях. За каждой уродливой проблемой прячется
какая-нибудь умная идиома, изящный языковой финт, благодаря которому проблема тает прямо на
глазах. Проблема решается так же элегантно, как это сделал бы настоящий язык типа Smalltalk или
Lisp, но при этом ваш процессор не дымится от напряжения, а на Уолл-Стрит не растут акции
производителей чипов памяти. С++ — вообще не язык. Это мировоззрение или наркотик, меняющий
способ мышления.
Но вернемся к слову «элегантный». В программировании на С++ действует перефразированный
принцип Дао: «Чтобы достичь истинной элегантности, нужно отказаться от стремления к
элегантности». С++ во многом представляет собой С следующего поколения. Написанные на нем
программы эффективно компилируются и быстро работают. Он обладает очень традиционной блочной
структурой и сокращенной записью для многих распространенных операций (например, i++). В нем
есть свои существительные, глаголы, прилагательные и свой жаргон:
out << 17 << endl << flush;
Ревнители чистоты языка часто нападают на С++. Они полагают, что высшее достижение современной
цивилизации — язык, построенный исключительно из атомов и скобок. По мнению этих террористов
от синтаксиса, если простую переменную с первого взгляда невозможно отличить от вызова функции
или макроса — это вообще не язык, а шарлатанство для развлечения праздной толпы. К сожалению,
теория расходится с практикой. В реальной жизни толпа платит лишь за то, чтобы видеть языки, в
которых разные идеи выглядят по-разному. «Простые и последовательные» языки никогда не
пользовались особым успехом за стенками академий, а языки с блочной структурой овладели массами.
Стоит ли этому удивляться? Ведь компьютерные языки приходится изучать и запоминать, а для этого
используется то же серое вещество, с помощью которого мы изучаем и запоминаем естественные
языки. Попробуйте-ка назвать хотя бы один естественный язык без существительных, глаголов и
скобок! Я бы не рискнул. Все наши познания в лингвистике говорят о том, что эти «плохие»
особенности только ускоряют изучение компьютерного языка и делают его более понятным. i++ во
всех отношениях действительно понятнее, чем i:=i+1, а x=17+29 читается лучше, нежели (setq
x(+17, 29. Речь идет не о строении компьютерного языка, а скорее о нашем собственном
строении. Все уродства С++ — это в основном наши уродства. Когда вы научитесь понимать и любить
его странности, когда перестанете беспокоиться о математической стройности, будет сделан ваш
первый шаг к достижению элегантности в С++.
С++ наряду с Lisp, Smalltalk и другими динамическими языками (в отличие от С) обладает средствами
для низкоуровневых манипуляций с компьютером. Вы можете создать свой собственный тип данных и
подсунуть его компилятору так, чтобы он принял этот тип за встроенный. Вы можете управлять
вызовами своих функций, обращениями к переменным классов, выделением и освобождением памяти,
инициализацией и удалением объектов — и все это (в основном) происходит без потери
эффективности или безопасности типов. Но в отличие от других языков, если эта сила будет применена
неправильно, программа на С++ «грохнется». А если устоит программа, грохнутся ваши коллеги-
программисты — если вы не придумаете, как пояснить свои намерения и использовать правильную
идиому для особенно сложных моментов. Как известно, Дедал со своим сыном Икаром бежал и
заточения на Крите с помощью крыльев, сделанных из перьев и воска. Дедал, главный архитектор и
изобретатель, спокойно порхал где-то внизу. Его безрассудный сын поднялся слишком высоко к
солнцу и упал в море. Хммм… Нет, пожалуй, аналогия получилась неудачная. Ведь именно Дедал
построил Лабиринт — такой сложный, что в попытках выбраться из него люди либо умирали, либо
попадали на обед к Минотавру. Может, попробуем более современную аналогию? Используя
низкоуровневые возможности С++, вы действуете, как суровый детектив с его сакраментальной
фразой: «Доверься мне — я знаю, что делаю». Компилятор закатывает глаза и безмолвно подчиняется.
С++ интригует своими явными противоречиями. Его гибкость легко превращается в главный источник
ошибок. За возможности его расширения не приходится расплачиваться скоростью или объемом кода.
Он элегантен в одних руках и опасен в других, прост и сложен одновременно. После нескольких лет
работы вы так и не можете решить, восхищаться им или проклинать. Да, настоящий знаток понимает
все концепции, лежащие в основе языка и склоняющие чашу весов в его пользу. Эти концепции не
видны с первого взгляда; чтобы понять их, необходимо в течение нескольких лет пытаться решать
совершенно разные задачи. Некоторые архитектурные парадигмы лучше всего соответствуют
конкретным языковым решениям. Их неправильное сочетание обернется хаосом, а правильное —
элегантностью.
Jeff Alger, «C++ for Real Programmers».
Позволил себе отметить курсивом, на мой взгляд, важный для понимания отрывок.
Дао С++
С++ — язык, который изучается постепенно. Лишь после того, как будет сделан последний шаг,
разрозненные приемы и фрагменты синтаксиса начинают складываться в общую картину. По-моему,
изучение С++ чем-то напоминает подъем на лифте. Дзынь! Второй этаж. С++ — это
усовершенствованный вариант С, с сильной типизацией (которую, впрочем, при желании можно
обойти) и удобными комментариями //. Любой программист на С, если он не хочет подаваться в
менеджеры, должен двигаться дальше… а Бьярн Страуструп (Господи, благослови его) придумал для
этого отличную возможность.
Дзынь! Третий этаж. С++ — хороший, хотя и не потрясающий объектно-ориентированный язык
программирования. Не Smalltalk, конечно, но чего ожидать от языка, работающего с такой
головокружительной скоростью? С++ — это Cobol 90-х, политически выдержанный язык, которые
гарантирует финансирование вашего проекта высшим руководством. А уж если С++ достаточно часто
упоминается в плане, можно надеяться на удвоение бюджета. Это тоже хорошо, потому что никто
толком не умеет оценивать проекты на С++ и управлять ими. А что касается инструментария — глаза
разбегаются, не правда ли?
Дзынь! Последний этаж, все выходят. Но позвольте, где же «все»? Лифт почти пуст. С++ — это на
самом деле не столько язык, сколько инструмент для создания ваших собственных языков. Его
элегантность заключается отнюдь не в простоте (слова С++ и простота режут слух своим явным
противоречием а в его потенциальных возможностях. За каждой уродливой проблемой прячется
какая-нибудь умная идиома, изящный языковой финт, благодаря которому проблема тает прямо на
глазах. Проблема решается так же элегантно, как это сделал бы настоящий язык типа Smalltalk или
Lisp, но при этом ваш процессор не дымится от напряжения, а на Уолл-Стрит не растут акции
производителей чипов памяти. С++ — вообще не язык. Это мировоззрение или наркотик, меняющий
способ мышления.
Но вернемся к слову «элегантный». В программировании на С++ действует перефразированный
принцип Дао: «Чтобы достичь истинной элегантности, нужно отказаться от стремления к
элегантности». С++ во многом представляет собой С следующего поколения. Написанные на нем
программы эффективно компилируются и быстро работают. Он обладает очень традиционной блочной
структурой и сокращенной записью для многих распространенных операций (например, i++). В нем
есть свои существительные, глаголы, прилагательные и свой жаргон:
out << 17 << endl << flush;
Ревнители чистоты языка часто нападают на С++. Они полагают, что высшее достижение современной
цивилизации — язык, построенный исключительно из атомов и скобок. По мнению этих террористов
от синтаксиса, если простую переменную с первого взгляда невозможно отличить от вызова функции
или макроса — это вообще не язык, а шарлатанство для развлечения праздной толпы. К сожалению,
теория расходится с практикой. В реальной жизни толпа платит лишь за то, чтобы видеть языки, в
которых разные идеи выглядят по-разному. «Простые и последовательные» языки никогда не
пользовались особым успехом за стенками академий, а языки с блочной структурой овладели массами.
Стоит ли этому удивляться? Ведь компьютерные языки приходится изучать и запоминать, а для этого
используется то же серое вещество, с помощью которого мы изучаем и запоминаем естественные
языки. Попробуйте-ка назвать хотя бы один естественный язык без существительных, глаголов и
скобок! Я бы не рискнул. Все наши познания в лингвистике говорят о том, что эти «плохие»
особенности только ускоряют изучение компьютерного языка и делают его более понятным. i++ во
всех отношениях действительно понятнее, чем i:=i+1, а x=17+29 читается лучше, нежели (setq
x(+17, 29. Речь идет не о строении компьютерного языка, а скорее о нашем собственном
строении. Все уродства С++ — это в основном наши уродства. Когда вы научитесь понимать и любить
его странности, когда перестанете беспокоиться о математической стройности, будет сделан ваш
первый шаг к достижению элегантности в С++.
С++ наряду с Lisp, Smalltalk и другими динамическими языками (в отличие от С) обладает средствами
для низкоуровневых манипуляций с компьютером. Вы можете создать свой собственный тип данных и
подсунуть его компилятору так, чтобы он принял этот тип за встроенный. Вы можете управлять
вызовами своих функций, обращениями к переменным классов, выделением и освобождением памяти,
инициализацией и удалением объектов — и все это (в основном) происходит без потери
эффективности или безопасности типов. Но в отличие от других языков, если эта сила будет применена
неправильно, программа на С++ «грохнется». А если устоит программа, грохнутся ваши коллеги-
программисты — если вы не придумаете, как пояснить свои намерения и использовать правильную
идиому для особенно сложных моментов. Как известно, Дедал со своим сыном Икаром бежал и
заточения на Крите с помощью крыльев, сделанных из перьев и воска. Дедал, главный архитектор и
изобретатель, спокойно порхал где-то внизу. Его безрассудный сын поднялся слишком высоко к
солнцу и упал в море. Хммм… Нет, пожалуй, аналогия получилась неудачная. Ведь именно Дедал
построил Лабиринт — такой сложный, что в попытках выбраться из него люди либо умирали, либо
попадали на обед к Минотавру. Может, попробуем более современную аналогию? Используя
низкоуровневые возможности С++, вы действуете, как суровый детектив с его сакраментальной
фразой: «Доверься мне — я знаю, что делаю». Компилятор закатывает глаза и безмолвно подчиняется.
С++ интригует своими явными противоречиями. Его гибкость легко превращается в главный источник
ошибок. За возможности его расширения не приходится расплачиваться скоростью или объемом кода.
Он элегантен в одних руках и опасен в других, прост и сложен одновременно. После нескольких лет
работы вы так и не можете решить, восхищаться им или проклинать. Да, настоящий знаток понимает
все концепции, лежащие в основе языка и склоняющие чашу весов в его пользу. Эти концепции не
видны с первого взгляда; чтобы понять их, необходимо в течение нескольких лет пытаться решать
совершенно разные задачи. Некоторые архитектурные парадигмы лучше всего соответствуют
конкретным языковым решениям. Их неправильное сочетание обернется хаосом, а правильное —
элегантностью.
Jeff Alger, «C++ for Real Programmers».
"Миллионы мух не могут ошибаться."
Ты выделил курсивом именно это.
В продолжнение темы:
литературный журнал компьютерра недавно
опубликовал очередное творение P.Graham'а.
Как всегда про хаккиров и правильные языки.
http://www.computerra.ru/think/35350/
http://www.computerra.ru/think/35404/
Ты выделил курсивом именно это.
В продолжнение темы:
литературный журнал компьютерра недавно
опубликовал очередное творение P.Graham'а.
Как всегда про хаккиров и правильные языки.
http://www.computerra.ru/think/35350/
http://www.computerra.ru/think/35404/
Что, в Си++ появилось возведение в степень?
> С++ --- это на самом деле не столько язык, сколько инструмент
> для создания ваших собственных языков.
Попробуй создать на нём DSL хоть сколько-то отличающийся от
процедурного.
> Проблема решается так же элегантно, как это сделал бы
> настоящий язык типа Smalltalk или Lisp, но при этом ваш
> процессор не дымится от напряжения, а на Уолл-Стрит не растут
> акции производителей чипов памяти.
Как насчёт Си++ на 8-разрядных машинах?
А вот смолтолковские были.
> С++ --- вообще не язык. Это мировоззрение или наркотик,
> меняющий способ мышления.
Императивный стиль мышления настолько не нов, что менять его
надо именно с помощью императивного языка.
Кстати, ты хоть раз пробовал создавать на основе Си какой-нибудь
язык?
> Вы можете создать свой собственный тип данных и подсунуть его
> компилятору так, чтобы он принял этот тип за встроенный.
Предлагаю тебе доопределить ранее упомянутый "unsigned long int"
до "BINARY(48)", чтобы подсунуть его вместо встроенного
неизвестной разрядности.
Заодно расскажи, как средствами языка Си замерить собственную
разрядность и сразу же использовать её в своей программе.
Да, очередное "Real Programmers Don't Use Pascal" не надо.
В подобных случаях некто Луговский предлагает отправлять в
биореактор.
Последнее время я склоняюсь к тому, чтобы с ним согласиться.
---
...Я работаю антинаучным аферистом...
> С++ --- это на самом деле не столько язык, сколько инструмент
> для создания ваших собственных языков.
Попробуй создать на нём DSL хоть сколько-то отличающийся от
процедурного.
> Проблема решается так же элегантно, как это сделал бы
> настоящий язык типа Smalltalk или Lisp, но при этом ваш
> процессор не дымится от напряжения, а на Уолл-Стрит не растут
> акции производителей чипов памяти.
Как насчёт Си++ на 8-разрядных машинах?
А вот смолтолковские были.
> С++ --- вообще не язык. Это мировоззрение или наркотик,
> меняющий способ мышления.
Императивный стиль мышления настолько не нов, что менять его
надо именно с помощью императивного языка.
Кстати, ты хоть раз пробовал создавать на основе Си какой-нибудь
язык?
> Вы можете создать свой собственный тип данных и подсунуть его
> компилятору так, чтобы он принял этот тип за встроенный.
Предлагаю тебе доопределить ранее упомянутый "unsigned long int"
до "BINARY(48)", чтобы подсунуть его вместо встроенного
неизвестной разрядности.
Заодно расскажи, как средствами языка Си замерить собственную
разрядность и сразу же использовать её в своей программе.
Да, очередное "Real Programmers Don't Use Pascal" не надо.
В подобных случаях некто Луговский предлагает отправлять в
биореактор.
Последнее время я склоняюсь к тому, чтобы с ним согласиться.
---
...Я работаю антинаучным аферистом...
> Что, в Си++ появилось возведение в степень?
функцию pow уже отменили?
> Попробуй создать на нём DSL хоть сколько-то отличающийся от
процедурного.
функциональную парадигму же сделали, да и lazy-вычисления тоже.
> Как насчёт Си++ на 8-разрядных машинах?
и в чем проблема?
C++ и сейчас используется на 8-битных процессорах
> Предлагаю тебе доопределить ранее упомянутый "unsigned long int"
> до "BINARY(48)", чтобы подсунуть его вместо встроенного
> неизвестной разрядности.
Берешь любой класс LargeNumber и используешь. http://www.codeproject.com/cpp/largenumber.asp
> Заодно расскажи, как средствами языка Си замерить собственную разрядность
sizeof
> и сразу же использовать её в своей программе
int q[sizeof(long)];
функцию pow уже отменили?
> Попробуй создать на нём DSL хоть сколько-то отличающийся от
процедурного.
функциональную парадигму же сделали, да и lazy-вычисления тоже.
> Как насчёт Си++ на 8-разрядных машинах?
и в чем проблема?
C++ и сейчас используется на 8-битных процессорах
> Предлагаю тебе доопределить ранее упомянутый "unsigned long int"
> до "BINARY(48)", чтобы подсунуть его вместо встроенного
> неизвестной разрядности.
Берешь любой класс LargeNumber и используешь. http://www.codeproject.com/cpp/largenumber.asp
> Заодно расскажи, как средствами языка Си замерить собственную разрядность
sizeof
> и сразу же использовать её в своей программе
int q[sizeof(long)];
хм. а сейчас есть восьмибитные процессоры?
Кажись даже легендарный Z80 был 16-битным..
Кажись даже легендарный Z80 был 16-битным..
> а сейчас есть восьмибитные процессоры?
8-битные процессоры сейчас активно используются в промышленных контроллерах, бытовой технике и т.д.
8-битные процессоры сейчас активно используются в промышленных контроллерах, бытовой технике и т.д.
Название хоть одного?
потомки i8051 вроде бы до сих пор популярны
PS насчёт z80 тебя обманули
PS насчёт z80 тебя обманули
Z80
intel-8080
motorola M68HC08
8051/8052 MCU
intel-8080
motorola M68HC08
8051/8052 MCU
Любой язык не для всех. Кому-то этот язык не нравится, ему бросаются в глаза недочеты, которые он считает непростительными. Вот так и появляются новые языки.
Если ты не любишь С++ — не пиши на нем. Зачем его чернить на форуме? Тебе не нравиться, что большинство его приемлет, если не любит? Тогда создай свой, настолько хороший, что все на него перейдут.
Всем, надеюсь, понятно, что С++ Лиспом или Перлом не заменишь — так нехрен их постоянно сравнивать. Они для разных целей и разных людей.
P. S. Ах да, насчет мух. Если ты больше мухи, расскажи, пожалуйста, что такого великого написал ты? Достаточно великого, чтобы отбрасывать тень среди толпы С++-программистов.
Если ты не любишь С++ — не пиши на нем. Зачем его чернить на форуме? Тебе не нравиться, что большинство его приемлет, если не любит? Тогда создай свой, настолько хороший, что все на него перейдут.
Всем, надеюсь, понятно, что С++ Лиспом или Перлом не заменишь — так нехрен их постоянно сравнивать. Они для разных целей и разных людей.
P. S. Ах да, насчет мух. Если ты больше мухи, расскажи, пожалуйста, что такого великого написал ты? Достаточно великого, чтобы отбрасывать тень среди толпы С++-программистов.
>> Что, в Си++ появилось возведение в степень?
> функцию pow уже отменили?
static unsigned long int buf[pow(2,12)];
>> Попробуй создать на нём DSL хоть сколько-то отличающийся от
>> процедурного.
> функциональную парадигму же сделали,
> да и lazy-вычисления тоже.
DSL --- это не только парадигма.
Hosted?
>> Заодно расскажи, как средствами языка Си замерить собственную разрядность
> sizeof
И что, для sizeof(int) оно покажет 32?
---
...Я работаю антинаучным аферистом...
> функцию pow уже отменили?
static unsigned long int buf[pow(2,12)];
>> Попробуй создать на нём DSL хоть сколько-то отличающийся от
>> процедурного.
> функциональную парадигму же сделали,
> да и lazy-вычисления тоже.
DSL --- это не только парадигма.
Из "живого" проекта:> C++ и сейчас используется на 8-битных процессорах
ПЛОСКОСТЬ Базовая
ПРЯМАЯ Прямая1
ПРЯМАЯ Прямая2
УГОЛ МЕЖДУ Прямая1 И Прямая2 БАЗА Базовая
HОМИHАЛЬHО 18
+ДОПУСК 0.1
-ДОПУСК -0.1
Hosted?
>> Заодно расскажи, как средствами языка Си замерить собственную разрядность
> sizeof
И что, для sizeof(int) оно покажет 32?
---
...Я работаю антинаучным аферистом...
С++ легко заменяется Лиспом.
И выгоды от этой замены очевидны.
Это понятно любому, кто достаточно с ним знаком.
---
...Я работаю антинаучным аферистом...
И выгоды от этой замены очевидны.
Это понятно любому, кто достаточно с ним знаком.
---
...Я работаю антинаучным аферистом...
Кстати, о больших числах.
Заменить "(unsigned) (long) int" я могу?
Или придётся везде перебивать "(unsigned) (long) int" в
"(UL)Int"?
И где, после этого, хвалёная переносимость?
---
...Я работаю антинаучным аферистом...
Заменить "(unsigned) (long) int" я могу?
Или придётся везде перебивать "(unsigned) (long) int" в
"(UL)Int"?
И где, после этого, хвалёная переносимость?
---
...Я работаю антинаучным аферистом...
Можно вопрос? Это ж как, например, написать Doom3 на ЛИСПе? И какие от этого будут выгоды?
Во-первых, будет настоящая, а не выдуманная, переносимость.
Во-вторых появится распараллеливаемость на сколько есть
процессоров, и этим будет заниматься компилятор.
Наверняка появится ещё что-нибудь.
---
...Я работаю антинаучным аферистом...
Во-вторых появится распараллеливаемость на сколько есть
процессоров, и этим будет заниматься компилятор.
Наверняка появится ещё что-нибудь.
---
...Я работаю антинаучным аферистом...
Так же, как и недостатки. Пример ОС на ЛИСПе? Или мы говорим о б. м. в.?
P. S . бесконечно мощный вычислитель =)
P. S . бесконечно мощный вычислитель =)
Ключевое слово: Symbolics.
---
...Я работаю антинаучным аферистом...
---
...Я работаю антинаучным аферистом...
Прошу простить, счет на Интернет опустел полчаса назад. И как, работает?
Ага, и сколько эта твоя переносимость оставит от FPS? И кто купит такую игру, если у большинства стоит винда, и им эта переносимость никуда не впилась - они думают о динамичности игры. И потом, я слабо понимаю, как всё-таки его написать на ЛИСПе?
Работает.
Кстати, объяснишь, почему DoD выбрала в качестве стандартных
языков для СРВ Аду и Лисп?
Можешь задуматься.
---
...Я работаю антинаучным аферистом...
Кстати, объяснишь, почему DoD выбрала в качестве стандартных
языков для СРВ Аду и Лисп?
Можешь задуматься.
---
...Я работаю антинаучным аферистом...
Их легко может оказаться даже больше.
Учи матчасть.
---
...Я работаю антинаучным аферистом...
Учи матчасть.
---
...Я работаю антинаучным аферистом...
Их легко может оказаться даже больше.Я в этом ОЧЕНЬ сильно сомневаюсь.
Учи матчасть.Ответ-отмазка. Я всё понял, спасибо за коментарии.
>Их легко может оказаться даже больше
ну да, конечно
ну да, конечно

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

К сожалению, я не знаю этих обозначений.
Задуматься почему кто-то, пусть, скажем, Microsoft, пользуется VB... Потому что им нужен он. Но это не значит, что он нужен везде и всегда.
Задуматься почему кто-то, пусть, скажем, Microsoft, пользуется VB... Потому что им нужен он. Но это не значит, что он нужен везде и всегда.
> static unsigned long int buf[pow(2,12)];
> И что, для sizeof(int) оно покажет 32?
юзай тогда numeric_limits<unsigned long int>::max
template<int k, int n>
class pow
{
public:
enum{
value = k * pow<k, n-1>::value
};
};
template<int k>
class pow<k, 1>
{
public:
enum
{
value = k
};
};
int _tmain(int argc, _TCHAR* argv[])
{
unsigned long int q[pow<2, 12>::value];
std::cout << sizeof(q) << std::endl;
return 0;
}
> И что, для sizeof(int) оно покажет 32?
юзай тогда numeric_limits<unsigned long int>::max
Это провокация? Мол, обижусь за применение понятия «женственности» к себе — значит, что я что-то там додумал и тем самым подтвердил твои слова, придавая им основательность? Или подумав вышеописанное я уже совершил этот шаг?
Нет уж, дудки. Считай, что я ничего не писал. Эсли вспылил лишнего — прости, но за «мух» обидно.
Нет уж, дудки. Считай, что я ничего не писал. Эсли вспылил лишнего — прости, но за «мух» обидно.
Агностический скептик?
Для того, чтобы знать, нужно знать.
А пересказывать учебник по общему шёпоту я считаю занятием
бесполезным. Захочешь --- сам прочитаешь.
---
...Я работаю антинаучным аферистом...
Для того, чтобы знать, нужно знать.
А пересказывать учебник по общему шёпоту я считаю занятием
бесполезным. Захочешь --- сам прочитаешь.
---
...Я работаю антинаучным аферистом...
Не хватает языка --- возьми текстовый препроцессор.
Не хватает препроцессора --- возьми препроцессор помощнее.
Заметь, что у тебя появилось две разных конструкции, для
компиляции и для исполнения, имеющих один и тот же смысл.
Кстати, в другом месте встречал нехватку возможностей вычислений
в ходе компиляции. Вроде заполнения простенькой таблички.
Что-то такое:
Я знаю, что это обходится через make,
но опять же --- это от бедности.
---
...Я работаю антинаучным аферистом...
Не хватает препроцессора --- возьми препроцессор помощнее.
Заметь, что у тебя появилось две разных конструкции, для
компиляции и для исполнения, имеющих один и тот же смысл.
Кстати, в другом месте встречал нехватку возможностей вычислений
в ходе компиляции. Вроде заполнения простенькой таблички.
Что-то такое:
CREATE Table szTable ALLOT
MARKER forget-it
: fill-table ... ;
fill-table
forget-it
Я знаю, что это обходится через make,
но опять же --- это от бедности.
---
...Я работаю антинаучным аферистом...
> Не хватает препроцессора --- возьми препроцессор помощнее.
Совсем не согласен.
Препроцессор - это зло: препроцессор работает с текстом, а не с программой.
Совсем не согласен.
Препроцессор - это зло: препроцессор работает с текстом, а не с программой.
Можно подумать, что я согласен.
Только почему-то твой pow для компиляции имеет сильно
отличающийся от обычного синтаксис.
Хотя выполняет, казалось бы, не очень-то сложное действие.
---
...Я работаю антинаучным аферистом...
Только почему-то твой pow для компиляции имеет сильно
отличающийся от обычного синтаксис.
Хотя выполняет, казалось бы, не очень-то сложное действие.
---
...Я работаю антинаучным аферистом...
Ну, зря Вы так, батенька!
C суть Assembler, переносимый за счет макроопределения команд процессора.
С++ суть C, удобный за счет макроопределения всего остального =)
Вот перегрузка — добро? Добро!
А шаблоны? Ого-го-го!
Если язык должен хорошо транслироваться в машинный код, то он должен, ну просто обязан, быть макро...макроассеблером.
C суть Assembler, переносимый за счет макроопределения команд процессора.
С++ суть C, удобный за счет макроопределения всего остального =)
Вот перегрузка — добро? Добро!
А шаблоны? Ого-го-го!
Если язык должен хорошо транслироваться в машинный код, то он должен, ну просто обязан, быть макро...макроассеблером.
> Если язык должен хорошо транслироваться в машинный код,
> то он должен, ну просто обязан, быть макро...макроассеблером.
Он должен быть как можно больше непохож на машинный код.
Иначе ты проиграешь как на разнице в уровнях абстракции,
так и на переносимости.
---
...Я работаю антинаучным аферистом...
> то он должен, ну просто обязан, быть макро...макроассеблером.
Он должен быть как можно больше непохож на машинный код.
Иначе ты проиграешь как на разнице в уровнях абстракции,
так и на переносимости.
---
...Я работаю антинаучным аферистом...
Это проблемы плюсов.
Потому что в переносимом коде могут и должны быть написаны
требования к среде исполнения.
Плюсы этого не позволяют сделать никак.
---
...Я работаю антинаучным аферистом...
Потому что в переносимом коде могут и должны быть написаны
требования к среде исполнения.
Плюсы этого не позволяют сделать никак.
---
...Я работаю антинаучным аферистом...
Не обратил раньше внимания.
> С++ --- это Cobol 90-х, политически выдержанный язык, который
> гарантирует финансирование вашего проекта высшим руководством.
Ты видел хотя бы одну программу на Коболе?
В ней обязательно, обязательно описываются требования к
инструментальной и целевой машинам.
Сможешь ты в Си написать требования к разрядности слова,
на которую расчитана программа?
Кстати, Кобол использовался раньше для того, для чего сейчас
используется SQL.
Да, и сравнения наподобие "Кобол наших дней" употребляется после
некоторых событий исключительно в отрицательном смысле.
---
...Я работаю антинаучным аферистом...
> С++ --- это Cobol 90-х, политически выдержанный язык, который
> гарантирует финансирование вашего проекта высшим руководством.
Ты видел хотя бы одну программу на Коболе?
В ней обязательно, обязательно описываются требования к
инструментальной и целевой машинам.
Сможешь ты в Си написать требования к разрядности слова,
на которую расчитана программа?
Кстати, Кобол использовался раньше для того, для чего сейчас
используется SQL.
Да, и сравнения наподобие "Кобол наших дней" употребляется после
некоторых событий исключительно в отрицательном смысле.
---
...Я работаю антинаучным аферистом...
>Это проблемы плюсов.
не, твоя
>Плюсы этого не позволяют сделать никак.
учи матчасть
не, твоя
>Плюсы этого не позволяют сделать никак.
учи матчасть
>> Если язык должен хорошо транслироваться в машинный код,
>> то он должен, ну просто обязан, быть макро...макроассеблером.
>Он должен быть как можно больше непохож на машинный код.
>Иначе ты проиграешь как на разнице в уровнях абстракции,
>так и на переносимости.
Это опровержение или подтверждение?
А за Джеффа говорить не буду.
>> то он должен, ну просто обязан, быть макро...макроассеблером.
>Он должен быть как можно больше непохож на машинный код.
>Иначе ты проиграешь как на разнице в уровнях абстракции,
>так и на переносимости.
Это опровержение или подтверждение?
А за Джеффа говорить не буду.
Ну-ну.
Переведи на плюсы следующее:
Хотя бы это.
---
...Я работаю антинаучным аферистом...
Переведи на плюсы следующее:
X: digits 30;
N: INTEGER range 0..2**48;
Хотя бы это.
---
...Я работаю антинаучным аферистом...
Опровержение.
---
...Я работаю антинаучным аферистом...
---
...Я работаю антинаучным аферистом...
> Переведи на плюсы следующее
Я же тебе уже давал ссылку на класс largeNumber
я правильно понял, что digits - это десятичные цифры?
Будет:
largeNumber<log<pow<10, 30>::value, 2>::value > x;
largeNumber<48> y;
ps
Задачи ты ставишь немножко некорретные, ты берешь то, что уже встроено в язык, и предлагаешь - это сделать на другом языке - конечно, другой язык проиграет, если это в него не встроенно.
Интересннее сравнивать на тех задачах, которые и там, и там не вcтроенны.
1. Вот допустим, как будет выглядеть реализация complex-ного числа повышенной точности на твоем любимом языке? интересует тот случай, если такие числа не встроены в сам язык.
2. Или реализация разреженной матрицы? Причем желательно, чтобы способ работы отличался незначительно от обычной матрицы(массива).
Я же тебе уже давал ссылку на класс largeNumber
я правильно понял, что digits - это десятичные цифры?
Будет:
largeNumber<log<pow<10, 30>::value, 2>::value > x;
largeNumber<48> y;
ps
Задачи ты ставишь немножко некорретные, ты берешь то, что уже встроено в язык, и предлагаешь - это сделать на другом языке - конечно, другой язык проиграет, если это в него не встроенно.
Интересннее сравнивать на тех задачах, которые и там, и там не вcтроенны.
1. Вот допустим, как будет выглядеть реализация complex-ного числа повышенной точности на твоем любимом языке? интересует тот случай, если такие числа не встроены в сам язык.
2. Или реализация разреженной матрицы? Причем желательно, чтобы способ работы отличался незначительно от обычной матрицы(массива).
В моём любимом языке я могу переопределить всё.
Например, так:
Когда я работал на другой разрядности, было дело, что пришлось
её резко увеличивать вдвое.
С тех пор у меня есть числа удвоенной точности.
И учетверённой --- тоже.
Кто-то из "братьев по духу" делал числа утроенной точности.
Так что и это не беда.
Если делать матрицу и массив по-алгольному,
как int*int*...*int -> ref чего-то, то безразлично,
будет ли она разрежённая или неразрежённая.
Кстати, и в другом моём любимом языке я могу делать всё:
Надо уметь выбирать любимые языки.
---
...Я работаю антинаучным аферистом...
Например, так:
: * 2dup = over 2 = and if 2drop 5 else * then ;
Когда я работал на другой разрядности, было дело, что пришлось
её резко увеличивать вдвое.
С тех пор у меня есть числа удвоенной точности.
И учетверённой --- тоже.
Кто-то из "братьев по духу" делал числа утроенной точности.
Так что и это не беда.
Если делать матрицу и массив по-алгольному,
как int*int*...*int -> ref чего-то, то безразлично,
будет ли она разрежённая или неразрежённая.
Кстати, и в другом моём любимом языке я могу делать всё:
(define old-* *)
(define (* x y) (if (and (= x y) (= x 2 5 (old-* x y
Надо уметь выбирать любимые языки.
---
...Я работаю антинаучным аферистом...
> тех пор у меня есть числа удвоенной точности.
Ты не уходи от задачи.
Приведи, плиз, пример, который позволяет использовать complex-ные числа произвольной точности.
Особенно подчеркиваю слово complex-ные, и особенно подчеркиваю слово "произвольной".
Ты не уходи от задачи.
Приведи, плиз, пример, который позволяет использовать complex-ные числа произвольной точности.
Особенно подчеркиваю слово complex-ные, и особенно подчеркиваю слово "произвольной".
(define old-* *)
(define (* x y) (if (and (= x y) (= x 2 5 (old-* x y
но в этом языке полиморфизма не видать, как своих ушей, я правильно понял?
(define (* x y) (if (and (= x y) (= x 2 5 (old-* x y
но в этом языке полиморфизма не видать, как своих ушей, я правильно понял?
> Надо уметь выбирать любимые языки.
Состыковывать (кроме командной строки) - ты свои любимые языки умеешь?
Состыковывать (кроме командной строки) - ты свои любимые языки умеешь?
Неправильно.
number? и прочие есть.
Так что всё в порядке.
---
...Я работаю антинаучным аферистом...
number? и прочие есть.
Так что всё в порядке.
---
...Я работаю антинаучным аферистом...
FICL --- встраиваемый, Guile --- тоже.
---
...Я работаю антинаучным аферистом...
---
...Я работаю антинаучным аферистом...
Они делаются ненамного сложнее чисел двойной точности.
Точно так же определяешь нужные операции для твоих чисел и вперёд.
---
NON PLVS VLTRA
Точно так же определяешь нужные операции для твоих чисел и вперёд.
---
NON PLVS VLTRA
> number? и прочие есть.
Пример приведи, плиз.
Пример приведи, плиз.
ЧТо значит "встраиваемый"? Встраеваемый куда?
> Точно так же определяешь нужные операции для твоих чисел и вперёд.
Приведи пример, плиз, иначе - это голословное утверждение. Или хотя бы идею примера.
Приведи пример, плиз, иначе - это голословное утверждение. Или хотя бы идею примера.
vocabulary complex immediate
( default single precision )
: re forth fdrop ;
: im forth fnip ;
: + forth frot f+ frot frot f+ fswap ;
: minus forth fswap fminus fswap fminus ;
: - minus + ;
: dup forth fover fover ;
: drop forth fdrop fdrop ;
( Da Capo )
В итоге получаешь словарик, в котором все числа комплексные
нужной точности, а действия над ними обозначаются точно так же,
как и действия с остальными числами.
Разрядность замеряется обычным способом.
Например, через 4-(4/3)*3.
Во время компиляции принимаем решение, сколько раз
удваивать-утраивать-упятерять и собираем нужные
пары-тройки-пятёрки.
Требуемая точность обеспечена.
Так и получается "D.-S." расширение языка.
---
...Я работаю антинаучным аферистом...
Их очень много. Выпускают практически все крупные производители микросхем, научившиеся делать flash-память, и многие другие. А к вопросу сущестования C++ на них - например, IAR Systems имеет немного урезанный (по сравнению со стандартом) Embedded C++, который замечательно пашет примерно на двух десятках архитектур различных 8-битных контроллеров, процессоров и DSP.
> Во время компиляции принимаем решение
Как это делается?
Как это делается?
Хм.
Как обычно.
А для чего, иначе, нужны IMMEDIATE и POSTPONE/COMPILE/[COMPILE]?
---
...Я работаю антинаучным аферистом...
Как обычно.
А для чего, иначе, нужны IMMEDIATE и POSTPONE/COMPILE/[COMPILE]?
---
...Я работаю антинаучным аферистом...
А пример по полиморфизму?
(define number-* *)
(define (* x y)
(cond and (number? x) (number? y (number-* x y
and (list? x) (list? y)
(= (length x) 2) (= (length y) 2) ... )
;; Насколько ты параноик?
(list (apply - (map number-* x y
(apply + (map number-* x (reverse y
(else ...
В другом случае, есть очень хорошие средства управления
областями видимости, а потому всё обеспечивается простым их
переключением.
---
...Я работаю антинаучным аферистом...
Сие есть не что иное, как идиотизм.
Сие есть расширение языка внутренними его средствами.
Предложи решение сравнимой сложности для Си.
Плюсы уже могут вылететь по несравнимо большей сложности их самих.
---
...Я работаю антинаучным аферистом...
Предложи решение сравнимой сложности для Си.
Плюсы уже могут вылететь по несравнимо большей сложности их самих.
---
...Я работаю антинаучным аферистом...
ИМХО, это не полиморфизм.
При полиморфизме решение о том, что надо делать, делается на стороне вызываемомого, а не на стороне вызывающего.
При полиморфизме решение о том, что надо делать, делается на стороне вызываемомого, а не на стороне вызывающего.
Ну так сделай полиморфизм в Си без плюсов.
На том же уровне сложности.
Кстати, ты ещё различай относящееся к реализации расширения
языка и расширенному языку.
Оба решения допускают задание требуемой наименьшей точности.
Причём в рамках самих языков: с тем же синтаксисом, скрывающим
особенности реализации.
Основная мысль.
Отсутствие средства в исходном языке достаточно просто
уравновешивается возможностями развития языка:
при отсутствии готового решения возможно создание чуть более
дорогого заместителя, не требующего существенной переработки
исходного текста.
При отсутствии прямого, непосредственного решения, обходное
решение получается заполнением разрыва между требованиями
программы и возможностями инструмента, а не существенной
переработкой программы в расчёте на меньшие требования.
Вот это и понимается под переносимостью.
---
...Я работаю антинаучным аферистом...
На том же уровне сложности.
Кстати, ты ещё различай относящееся к реализации расширения
языка и расширенному языку.
Оба решения допускают задание требуемой наименьшей точности.
Причём в рамках самих языков: с тем же синтаксисом, скрывающим
особенности реализации.
Основная мысль.
Отсутствие средства в исходном языке достаточно просто
уравновешивается возможностями развития языка:
при отсутствии готового решения возможно создание чуть более
дорогого заместителя, не требующего существенной переработки
исходного текста.
При отсутствии прямого, непосредственного решения, обходное
решение получается заполнением разрыва между требованиями
программы и возможностями инструмента, а не существенной
переработкой программы в расчёте на меньшие требования.
Вот это и понимается под переносимостью.
---
...Я работаю антинаучным аферистом...
>Плюсы уже могут вылететь по несравнимо большей сложности их самих.
"сказки от КОНТРЫ" ч.2
"сказки от КОНТРЫ" ч.2
100-й пост ветки. КОНТРА наконец соизволил огласить 
Основную мысль

Вот точь-точь тот полиморфизм, как у тебя в коде.
#define add old_add
#include "something.h"
#undef add
void add (Data data)
{
if (isNumber(data
old_add(data);
else
...
}
Так где же ваш 48-разрядный "int" с действиями,
обозначаемыми такими привычными "+", "-", "*" и тому подобными?
---
...Я работаю антинаучным аферистом...
обозначаемыми такими привычными "+", "-", "*" и тому подобными?
---
...Я работаю антинаучным аферистом...
В плюсах будет и это.
du -h /mnt/distfiles/scheme48-1.1.tgz
2.0M /mnt/distfiles/scheme48-1.1.tgz
Полностью соответствует R5RS.
Пример столь же сложных компиляторов приплюснутых сей,
соответсвующих последнему принятому стандарту языка?
---
...Я работаю антинаучным аферистом...
2.0M /mnt/distfiles/scheme48-1.1.tgz
Полностью соответствует R5RS.
Пример столь же сложных компиляторов приплюснутых сей,
соответсвующих последнему принятому стандарту языка?
---
...Я работаю антинаучным аферистом...
Разве "int" уже не является зарезервированным?
---
...Я работаю антинаучным аферистом...
---
...Я работаю антинаучным аферистом...
Является.
Почему ты считаешь, что это создает какую-то серьезную проблему?
Почему ты считаешь, что это создает какую-то серьезную проблему?
Ни "class int", ни "typedef ... int" не пройдут.
Или ты предлагаешь "#define"?
---
...Я работаю антинаучным аферистом...
Или ты предлагаешь "#define"?
---
...Я работаю антинаучным аферистом...
чем плох MyInt?
Тем, что понадобится проходить везде и править.
Причём автомагически сделать это не получится из-за "func(...)" и "unsigned".
---
...Я работаю антинаучным аферистом...
Причём автомагически сделать это не получится из-за "func(...)" и "unsigned".
---
...Я работаю антинаучным аферистом...
replace "int" "MyInt<Signed>"
replace "unsigned\b+int" "MyInt<Unsigned>"
replace "unsigned\b+int" "MyInt<Unsigned>"
>столь же сложных
а мне на сложность компилятора плевать, это одноразовая сложность
кстати, интересно вдруг стало, в чём ты меряешь сложность?
а мне на сложность компилятора плевать, это одноразовая сложность
кстати, интересно вдруг стало, в чём ты меряешь сложность?
"unsigned"?
"...; f(...){...}"?
"unsigned /* .... */ int"?
Видишь, тебе уже приходится заморачиваться для того, чтобы всего
лишь заменить встроенный целый тип новым целым типом.
Хотя особых препятствий к этому быть не должно.
А как замерять имеющуюся разрядность?
Что, если заголовочных файлов не будет?
Здравствуй, напильник?
---
...Я работаю антинаучным аферистом...
"...; f(...){...}"?
"unsigned /* .... */ int"?
Видишь, тебе уже приходится заморачиваться для того, чтобы всего
лишь заменить встроенный целый тип новым целым типом.
Хотя особых препятствий к этому быть не должно.
А как замерять имеющуюся разрядность?
Что, если заголовочных файлов не будет?
Здравствуй, напильник?
---
...Я работаю антинаучным аферистом...
Тем не менее, даже использование самого навороченного
компилятора даёт заметные ограничения, определяемые
выразительностью самого языка.
В битах.
В качестве первого приближения использую исключение повторений
посредством кодирования gzip-ом (LZ77+Huff, что ли?).
---
...Я работаю антинаучным аферистом...
компилятора даёт заметные ограничения, определяемые
выразительностью самого языка.
В битах.
В качестве первого приближения использую исключение повторений
посредством кодирования gzip-ом (LZ77+Huff, что ли?).
---
...Я работаю антинаучным аферистом...
Тем не менее, даже использование самого навороченного
компилятора даёт заметные ограничения, определяемые
выразительностью самого языка.
тавтология какая-то
>В битах
>В качестве первого приближения использую исключение повторений
и какой смысл несёт такое "определение" сложности в применении к вот этому:
Плюсы уже могут вылететь по несравнимо большей сложности их самих.?
Вот Вы тут много говорили про выразительность. А можно вопрос поставить ребром? Что вы сможете сделать такого на Лиспе(или другом языке) чего я не смогу сделать на C++? Да, Вы не должны мне указывать КАК это сделать(ЭТО не будет похоже на Лисп
) ). Вот когда Вы мне представите такую задачу, я признаю что C++ менее выразителен чем выбранный Вами для демонстрации язык.
) ). Вот когда Вы мне представите такую задачу, я признаю что C++ менее выразителен чем выбранный Вами для демонстрации язык.Вот я о том же. хотелось увидеть пару восьмибитных процессоров - а уж компиляторы С++ я для них нашёл бы. просто мне убегать надо было и поиском некогда уже стало заниматься.
Так что утверждение про то, что С++ для 8-битных процессоров нет - неверно
Так что утверждение про то, что С++ для 8-битных процессоров нет - неверно
Читай выше.
Заменить встроенный int расширенным до требуемой разрядности ты уже не можешь.
Существует куча задач, решение которых на Си или приплюснутом Си требует заметно больших сил.
Я бы даже сказал, что существенно большая часть задач заметно сложнее решается на Си, чем на Лиспе.
Из уже упоминавшихся в этом разделе отсутствующих в сях возможностей можно отметить отсутствие отсутствие массивов, списков и функций, как равноправных с числами объектов.
---
...Я работаю антинаучным аферистом...
Заменить встроенный int расширенным до требуемой разрядности ты уже не можешь.
Существует куча задач, решение которых на Си или приплюснутом Си требует заметно больших сил.
Я бы даже сказал, что существенно большая часть задач заметно сложнее решается на Си, чем на Лиспе.
Из уже упоминавшихся в этом разделе отсутствующих в сях возможностей можно отметить отсутствие отсутствие массивов, списков и функций, как равноправных с числами объектов.
---
...Я работаю антинаучным аферистом...
У меня дома на полке лежит КР580ИК80.
Могу достать за относительно обозримое время: 6809, 6811, Z80A, 8051, PIC-16XX.
Как, кстати, с поддержкой платформ большей разрядности?
Всё так же будете перемножать 48-разрядные числа кусками по 16 разрядов?
А 22-разрядные --- по 11?
---
...Я работаю антинаучным аферистом...
Могу достать за относительно обозримое время: 6809, 6811, Z80A, 8051, PIC-16XX.
Как, кстати, с поддержкой платформ большей разрядности?
Всё так же будете перемножать 48-разрядные числа кусками по 16 разрядов?
А 22-разрядные --- по 11?
---
...Я работаю антинаучным аферистом...
>Читай выше.
>Заменить встроенный int расширенным до требуемой разрядности ты уже не можешь
ты что-то не то там вычитал, выше. может. перечитай
>Существует куча задач, решение которых на Си или приплюснутом Си требует заметно больших сил
КОНТРА, твои беды/непонимания от заблуждения, что плюсы - диалект сей
это не так, почитай вышеприведённого Элджера на досуге. много нового узнаешь о плюсах и сказках
>Я бы даже сказал, что существенно большая часть задач заметно сложнее решается на Си, чем на Лиспе.
опс, опять "сложность" всплыла. я правильно тебя понял, что это означает, что решение большей части задач на Си занимает больше битов чем на Лиспе?
уже писал, в чём твоя беда
в плюсах ты всегда можешь добиться, чтобы твои объекты были равноправны с встроенными 
>Заменить встроенный int расширенным до требуемой разрядности ты уже не можешь
ты что-то не то там вычитал, выше. может. перечитай
>Существует куча задач, решение которых на Си или приплюснутом Си требует заметно больших сил
КОНТРА, твои беды/непонимания от заблуждения, что плюсы - диалект сей
это не так, почитай вышеприведённого Элджера на досуге. много нового узнаешь о плюсах и сказках
>Я бы даже сказал, что существенно большая часть задач заметно сложнее решается на Си, чем на Лиспе.
опс, опять "сложность" всплыла. я правильно тебя понял, что это означает, что решение большей части задач на Си занимает больше битов чем на Лиспе?
Из уже упоминавшихся в этом разделе отсутствующих в сях возможностей можно отметить отсутствие отсутствие массивов, списков и функций, как равноправных с числами объектов.
уже писал, в чём твоя беда
в плюсах ты всегда можешь добиться, чтобы твои объекты были равноправны с встроенными 
Я знаю, что приплюснутые си к обыкновенным относятся только посредством покалеченных скобок.
Тем не менее, ограничения простых сей в приплюснутых не преодолены.
Добиться можно чего угодно, только какой ценой?
Вопрос не в том, чтобы добиться, а в том, чтобы добиться в _том_же_синтаксисе_.
То есть, чтобы писалось "unsigned long int A[pow(2,14)];", а не чего-то там с угловыми скобками и двоеточиями.
И чтобы сдвиг Бернулли (или как оно называется) записывался через
с _одним_ умножением.
А не через
с двумя умножениями и условным переходом.
---
...Я работаю антинаучным аферистом...
Тем не менее, ограничения простых сей в приплюснутых не преодолены.
Добиться можно чего угодно, только какой ценой?
Вопрос не в том, чтобы добиться, а в том, чтобы добиться в _том_же_синтаксисе_.
То есть, чтобы писалось "unsigned long int A[pow(2,14)];", а не чего-то там с угловыми скобками и двоеточиями.
И чтобы сдвиг Бернулли (или как оно называется) записывался через
x = (a*x) % m;
с _одним_ умножением.
А не через
x = a*(x%(m/a - (m%a)*(x/(m/a; if(x<0) x+=m;
с двумя умножениями и условным переходом.
---
...Я работаю антинаучным аферистом...
Ты не понял. Мне не нужна задача по обработке кода(заменить чего-то там на что-то там). Ты приведи мне полную постановку задачи как заказчик: входные данные, выходные данные, интерфейс, etc... Тогда и поговорим. А то что ты говоришь доказывает только то что Лисп(например) работает лучше чем С++ в качестве препроцессора
и не более. Вот так.
и не более. Вот так.> Ты приведи мне полную постановку задачи как заказчик:
Если "как заказчик" --- это никак не относится к
> входные данные, выходные данные, интерфейс, etc...
> А то что ты говоришь доказывает только то что Лисп (например)
> работает лучше чем С++ в качестве препроцессора и не более.
Это доказывает только то, что ты не знаком ни с чем, кроме С++.
> Вот так.
---
...Я работаю антинаучным аферистом...
Если "как заказчик" --- это никак не относится к
> входные данные, выходные данные, интерфейс, etc...
> А то что ты говоришь доказывает только то что Лисп (например)
> работает лучше чем С++ в качестве препроцессора и не более.
Это доказывает только то, что ты не знаком ни с чем, кроме С++.
> Вот так.
---
...Я работаю антинаучным аферистом...
Делать такие поспешные выводы на основании всего одной фразы... Это признак недалекого ума.
Во первых, я знаю не только C++. Во вторых, я знаком с некоторыми функциональными языками программирования(например Lisp(как часть(и основа) emacs ocaml, очень мало - Haskell). Конечно я знаком с ними меньше чем ты, но моих знаний хватает для того чтобы делать о них некоторые выводы. Функциональные языки не универсальны - я не представляю себе базу данных, созданную на Lisp. C++ же универсален. На нем можно решить ЛЮБУЮ задачу(может быть и с большими затратами труда нежели чем не Lisp(к примеру. Следовательно, он более выразителен(чтобы не было вопросов, под выразительностью я понимаю возможность ВЫРАЗИТЬ ту или иную программу на конкретном языке). Да, ты так и не привел задачу, о которой я тебя просил 
Во первых, я знаю не только C++. Во вторых, я знаком с некоторыми функциональными языками программирования(например Lisp(как часть(и основа) emacs ocaml, очень мало - Haskell). Конечно я знаком с ними меньше чем ты, но моих знаний хватает для того чтобы делать о них некоторые выводы. Функциональные языки не универсальны - я не представляю себе базу данных, созданную на Lisp. C++ же универсален. На нем можно решить ЛЮБУЮ задачу(может быть и с большими затратами труда нежели чем не Lisp(к примеру. Следовательно, он более выразителен(чтобы не было вопросов, под выразительностью я понимаю возможность ВЫРАЗИТЬ ту или иную программу на конкретном языке). Да, ты так и не привел задачу, о которой я тебя просил 
> И чтобы сдвиг Бернулли (или как оно называется) записывался через
Ты видешь большую разницу между "x = (a*x) % m;" , "x = BernulliShift(x, a, m)", "x = mod(a*x, m)"?
1. Вся разница между этими записями только "в привычке".
2. Расчетные задачи сегодня составляюь очень маленькую долю от ПО, которое пишется, поэтому реально очень редко возникает потребность в перекрытии операций.
Ты видешь большую разницу между "x = (a*x) % m;" , "x = BernulliShift(x, a, m)", "x = mod(a*x, m)"?
1. Вся разница между этими записями только "в привычке".
2. Расчетные задачи сегодня составляюь очень маленькую долю от ПО, которое пишется, поэтому реально очень редко возникает потребность в перекрытии операций.
>Добиться можно чего угодно, только какой ценой?
то есть у тебя больше не осталось сказок о непереносимости плюсов?
это хорошо
>Вопрос не в том, чтобы добиться, а в том, чтобы добиться в _том_же_синтаксисе_.
довольно бессмысленное требование, с учётом того, что ты вкладываешь в понятие "тот_же_синтаксис"
внимание, вопрос: а зачем это всё? кому это нужно?
я считаю, что запись MyInt A(pow(2,14; - это запись в том_же_синтаксисе. тем паче, что с А далее везде можно обращаться так же, как с переменной встроенного типа
>И чтобы сдвиг Бернулли (или как оно называется) записывался через
ДА! И чтобы эти изверги не смели писать if(a=b)
p.s. надуманные у тебя проблемы какие-то
любители SmallTalk-а хоть к более интересным вещам придираются, типа сборки мусора 
то есть у тебя больше не осталось сказок о непереносимости плюсов?
это хорошо
>Вопрос не в том, чтобы добиться, а в том, чтобы добиться в _том_же_синтаксисе_.
довольно бессмысленное требование, с учётом того, что ты вкладываешь в понятие "тот_же_синтаксис"
внимание, вопрос: а зачем это всё? кому это нужно?
я считаю, что запись MyInt A(pow(2,14; - это запись в том_же_синтаксисе. тем паче, что с А далее везде можно обращаться так же, как с переменной встроенного типа
>И чтобы сдвиг Бернулли (или как оно называется) записывался через
ДА! И чтобы эти изверги не смели писать if(a=b)
p.s. надуманные у тебя проблемы какие-то
любители SmallTalk-а хоть к более интересным вещам придираются, типа сборки мусора 
> я не представляю себе базу данных, созданную на Lisp
Обращаю внимание, что это недостаток исключительно твоего
воображения и ни в коем случае не лиспа.
> C++ же универсален. На нем можно решить ЛЮБУЮ задачу [...]
> Следовательно, он более выразителен.
Нихуя не "следовательно".
Данная импликация взята из воздуха (м.б. это "признак недалекого ума"?).
Возможность решить с помощью языка любую задачу называется алгоритмической
полнотой, если ты не в курсе. Кроме лиспа и плюсов таким свойством обладает ещё,
например, машина тьюринга.
"Следовательно, машина тьюринга более выразительна."
Говоря проще, "LOL, бля!"
Обращаю внимание, что это недостаток исключительно твоего
воображения и ни в коем случае не лиспа.
> C++ же универсален. На нем можно решить ЛЮБУЮ задачу [...]
> Следовательно, он более выразителен.
Нихуя не "следовательно".
Данная импликация взята из воздуха (м.б. это "признак недалекого ума"?).
Возможность решить с помощью языка любую задачу называется алгоритмической
полнотой, если ты не в курсе. Кроме лиспа и плюсов таким свойством обладает ещё,
например, машина тьюринга.
"Следовательно, машина тьюринга более выразительна."
Говоря проще, "LOL, бля!"
Для меня интересна не просто возможность решить задачу, а решить ее за приемлимое время/деньги/etc. Так вот, если ты не понял, то я имел в виду что на C++ можно решить любую задачу за приемлимое время/деньги/etc, чего нельзя сказать про Lisp/.../... В конце концов, почему императивные языки общеприняты, а функциональными пользуются только небольшим количеством разработчиков? Единственная достойная область для функциональных языков - вычисления и искуственный интеллект. Все. Да, в догонку, - некоторые люди считают что функциональные языки прощают огрехи проектирования(да вот к примеру КОНТРА тут все пытался выспросить как int заменить на нечто другое - при правильном проектировании такой задачи даже не возникнет). А это не есть хорошо, потому что эти огрехи вылезут рано или поздно, и починить программу уже будет намного сложнее.
> Для меня интересна не просто возможность решить задачу,
> а решить ее за приемлимое время/деньги/etc.
Обращаю внимание ещё раз: решить задачу твоими силами
или понятными тебе методами.
> В конце концов, почему императивные языки общеприняты,
> а функциональными пользуются только небольшим количеством разработчиков?
Опять "миллионы мух"... Почитай Graham'а чтоли, он как раз про это рассказывает.
Впрочем, просветление вряд ли наступит, но об этом в другой умной книжке написано.
> Единственная достойная область для функциональных
> языков - вычисления и искуственный интеллект. Все.
Ты о классической музыке по телефонным напевам судишь?
Вот когда научишься "любую задачу" решать и на ФЯ, и на ИЯ,
то я даже тебя послушаю относительно областей применения
того и другого.
> Да, в догонку, - некоторые люди считают что функциональные языки прощают
> огрехи проектирования...
Я не знаю, что именно утверждает контра, но огрехи проектирования не прощает никто.
Однако рефакторинг проги на плюсах производить гораздо сложнее, чем на ФЯ
(доводилось заниматься и тем, и другим).
А "правильное проектирование" -- это отображение функционального представления
в голове архитектора на код проекта ("как оно должно работать" в "что именно оно
должно для этого делать").
> а решить ее за приемлимое время/деньги/etc.
Обращаю внимание ещё раз: решить задачу твоими силами
или понятными тебе методами.
> В конце концов, почему императивные языки общеприняты,
> а функциональными пользуются только небольшим количеством разработчиков?
Опять "миллионы мух"... Почитай Graham'а чтоли, он как раз про это рассказывает.
Впрочем, просветление вряд ли наступит, но об этом в другой умной книжке написано.
> Единственная достойная область для функциональных
> языков - вычисления и искуственный интеллект. Все.
Ты о классической музыке по телефонным напевам судишь?
Вот когда научишься "любую задачу" решать и на ФЯ, и на ИЯ,
то я даже тебя послушаю относительно областей применения
того и другого.
> Да, в догонку, - некоторые люди считают что функциональные языки прощают
> огрехи проектирования...
Я не знаю, что именно утверждает контра, но огрехи проектирования не прощает никто.
Однако рефакторинг проги на плюсах производить гораздо сложнее, чем на ФЯ
(доводилось заниматься и тем, и другим).
А "правильное проектирование" -- это отображение функционального представления
в голове архитектора на код проекта ("как оно должно работать" в "что именно оно
должно для этого делать").
1) Ну хорошо. А нельзя ли мне показать несколько ссылочек на большие проекты, использующие функциональные языки?(про емакс я знаю).
2) Человек - не муха. Поэтому аналогии с мухами здесь абсолютно неуместны(кстати и не с мухами вовсе, а с леммингами). Программисты в основе своей довольно неглупые люди. Поэтому если большинство программистов предпочитает императивные языки...
4) Классическую музыку я предпочитаю просто слушать. Вот сейчас в моем playlist'е как раз Вивальди заиграл
5) Уметь решать и решать с приемлимыми трудозатрами - понятия никак не связанные. Ну покажи мне хоть одну базу данных, написанную на Lisp.
6) Вот еще что интересно, я просто пытаюсь высказать свое мнение по техническим вопросам, а моих глубокоуважаемых оппонентов все время почему-то тянет переходить на личности...
2) Человек - не муха. Поэтому аналогии с мухами здесь абсолютно неуместны(кстати и не с мухами вовсе, а с леммингами). Программисты в основе своей довольно неглупые люди. Поэтому если большинство программистов предпочитает императивные языки...
4) Классическую музыку я предпочитаю просто слушать. Вот сейчас в моем playlist'е как раз Вивальди заиграл

5) Уметь решать и решать с приемлимыми трудозатрами - понятия никак не связанные. Ну покажи мне хоть одну базу данных, написанную на Lisp.
6) Вот еще что интересно, я просто пытаюсь высказать свое мнение по техническим вопросам, а моих глубокоуважаемых оппонентов все время почему-то тянет переходить на личности...
Ничего удивительного: ты высказываешь своё мнение,
а следовательно сам переводишь разговор на свою личность
(надеюсь, ты не считаешь его суперобъективным и единстенно верным?).
Показывать и доказывать я ничего не собираюсь, так как уже сейчас вижу,
что это будет впустую (переубедить человека невозможно, если он этого
сам не хочет а вот указать на недостатки аргументации и элементы
фанатизма могу (так же, как и заметить подобные вещи за собой,
но в меньшей степени, т.к. со стороны наблюдать гораздо проще).
Просто представь возможность того, что мир может быть устроен чуть иначе,
чем тебе кажется сейчас, тогда ты сам найдёшь необходимые доказательства
или опровержения (вдруг я тебя обманываю? или всё-таки не обманываю?).
Само наличие людей, у которых после знакомства с ФП изменилось представление
о программировании (даже если они по-прежнему пишут на плюсах) или даже
об устройстве мира, должно свидетельствовать, что здесь, как минимум, не всё просто.
А программисты в первую очередь -- обычные люди, поэтому им свойственно
человеческое поведение, которое далеко не всегда является "умным".
Чаще всего оно подвержено первобытным инстинктам выживания
и членства в иерархии стада, нежели интеллекту, да и сам интеллект
от программистов требуется не всегда.
а следовательно сам переводишь разговор на свою личность
(надеюсь, ты не считаешь его суперобъективным и единстенно верным?).
Показывать и доказывать я ничего не собираюсь, так как уже сейчас вижу,
что это будет впустую (переубедить человека невозможно, если он этого
сам не хочет а вот указать на недостатки аргументации и элементы
фанатизма могу (так же, как и заметить подобные вещи за собой,
но в меньшей степени, т.к. со стороны наблюдать гораздо проще).
Просто представь возможность того, что мир может быть устроен чуть иначе,
чем тебе кажется сейчас, тогда ты сам найдёшь необходимые доказательства
или опровержения (вдруг я тебя обманываю? или всё-таки не обманываю?).
Само наличие людей, у которых после знакомства с ФП изменилось представление
о программировании (даже если они по-прежнему пишут на плюсах) или даже
об устройстве мира, должно свидетельствовать, что здесь, как минимум, не всё просто.
А программисты в первую очередь -- обычные люди, поэтому им свойственно
человеческое поведение, которое далеко не всегда является "умным".
Чаще всего оно подвержено первобытным инстинктам выживания
и членства в иерархии стада, нежели интеллекту, да и сам интеллект
от программистов требуется не всегда.
1) А ты сам можешь представить что мир устроен иначе и что функциональное программирование - никому не нужная вещь?
2) Ты не хочешь показывать и доказывать по другим причинам. Прежде всего потому что таких проектов сейчас нет. Раньше - были(тот же Symbolics. Но где он сейчас?). Сейчас специально прошвырнулся в Гугле. И действительно, есть проекты, написанные на Лиспе(или других ФЯ) - но это только системы вычислений(Maxima например) и AI.
3) Ты не прав. Я готов поменять свое мнение. Но для этого нужна нормальная аргументация. Каковой я до сих пор не увидел
4) Я считаю что мое мнение ничуть не менее объективно чем твое.(думаю что и не более
)
5) Наличие людей, познакомившихся с ФП и у которых не изменилось представление о программировании( я например) тоже много о чем говорит.
6) Может все-таки кинешь несколько ссылок?
2) Ты не хочешь показывать и доказывать по другим причинам. Прежде всего потому что таких проектов сейчас нет. Раньше - были(тот же Symbolics. Но где он сейчас?). Сейчас специально прошвырнулся в Гугле. И действительно, есть проекты, написанные на Лиспе(или других ФЯ) - но это только системы вычислений(Maxima например) и AI.
3) Ты не прав. Я готов поменять свое мнение. Но для этого нужна нормальная аргументация. Каковой я до сих пор не увидел

4) Я считаю что мое мнение ничуть не менее объективно чем твое.(думаю что и не более
)5) Наличие людей, познакомившихся с ФП и у которых не изменилось представление о программировании( я например) тоже много о чем говорит.
6) Может все-таки кинешь несколько ссылок?

Да.
Между этими записями есть громадная разница.
Если в первой и третьей у тебя записано одно умножение и одно деление,
то во второй неизвестно, сколько действий и каких.
И в сях имеет громадное значение способ записи, который ты используешь.
Я хорошо знаю, что такое переполнение.
Про нерасчётные задачи я потом расскажу, не волнуйся.
Там тоже есть, о чём поговорить.
Например, о bzero, memcpy и т. п.
---
...Я работаю антинаучным аферистом...
Между этими записями есть громадная разница.
Если в первой и третьей у тебя записано одно умножение и одно деление,
то во второй неизвестно, сколько действий и каких.
И в сях имеет громадное значение способ записи, который ты используешь.
Я хорошо знаю, что такое переполнение.
Про нерасчётные задачи я потом расскажу, не волнуйся.
Там тоже есть, о чём поговорить.
Например, о bzero, memcpy и т. п.
---
...Я работаю антинаучным аферистом...
БД на ФЯ делаются заметно проще, чем на ИЯ.
И язык запросов там не надо отдельный наворачивать.
"Почему императивные языки общеприняты, а функциональными пользуется
только небольшое количество разработчиков?"
Ну так! "...Миллионы мух не могут ошибаться!"
Ты, кстати, не понял, к чему относилась часть про "int."
Думай дальше.
И Ада, и ПЛ-1, к твоему сведению,--- императивные.
---
...Я работаю антинаучным аферистом...
И язык запросов там не надо отдельный наворачивать.
"Почему императивные языки общеприняты, а функциональными пользуется
только небольшое количество разработчиков?"
Ну так! "...Миллионы мух не могут ошибаться!"
Ты, кстати, не понял, к чему относилась часть про "int."
Думай дальше.
И Ада, и ПЛ-1, к твоему сведению,--- императивные.
---
...Я работаю антинаучным аферистом...
> 1) А ты сам можешь представить что мир устроен иначе
> и что функциональное программирование - никому не нужная вещь?
Твоя категоричность -- явный признак фанатизма.
Мне не нравится мир, в котором нет ФП, да и в окружающей меня действительности ФП есть и нужен.
Но я могу легко себе предствить толпы его не использующих "real programmer'ов"
(т.е. в качестве почти никому не нужной вещи и даже представить, откуда эти толпы берутся.
Вообще, обладание дополнительными знаниями -- всегда бонус,
в отличие от уверенности в ненужности этих знаний.
> 2) Ты не хочешь показывать и доказывать по другим причинам.
> Прежде всего потому что таких проектов сейчас нет.
Опять категоричность.
darcs -- система распределённой коллективной разработки.
Написана на haskell, от конкурирующих систем отличается
в первую очередь наличием теоретической базы.
Если этот проект ждёт успех, то не удивлюсь, что haskell оттуда исчезнет.
> Раньше - были(тот же Symbolics. Но где он сейчас?).
> Сейчас специально прошвырнулся в Гугле.
> И действительно, есть проекты, написанные на Лиспе(или других ФЯ) -
> но это только системы вычислений(Maxima например) и AI.
То, что ты кратко сформулировал, в виде AI, можно сказать по другому:
трудно формализуемые задачи, где начиная работать над проектом невозможно
сказать, как должен выглядеть результат. В частности, обработка естественных
языков (самый большой проект на хаскеле -- 50k строк -- занимается обработкой китайского).
Как только задача формализуется в достаточной степени, её переписывают
на какой-нибудь c++, после чего она начинает работать быстро, но теряет
гибкость.
А прототипы некоторых систем долгое время живут исключительно в виде
программулек на ФЯ (или даже в виде математических формул
потому как ещё нет возможности перенести заложенную в них идею
в "настоящий" проект (понимание принципа работы и логика верхнего
уровня есть, а привязки к конкретным данным ещё нет).
В частности, программы для обработки других программ.
Я уже писал про отображение функционального представления в императивный код,
все известные мне примеры и проекты на ФЯ служат одним из этапов этого отображения:
сначала модель в голове/на бумаге/на ФЯ для эффективного представления идей,
потом промышленная реализация на ИЯ для эффективного отображения на аппаратуру.
Только некоторые модели живут в функциональном виде слишком долго,
дожидаясь эффективной реализации, а некоторым такое представление оказывается ненужным.
> 3) Ты не прав. Я готов поменять свое мнение. Но для этого нужна нормальная аргументация.
> Каковой я до сих пор не увидел
Нет. Нужна прежде всего не нормальная внешняя аргументация, а собственная мотивация.
Тем более речь идёт о сопоставлении различных парадигм, и аргументация здесь не поможет.
Нужно сначала самому увидеть, а потом уже оценить и сравнить.
Категоричность при этом должна исчезнуть: две реальности равноправны,
и в каждой из них можно жить, но у обеих есть преимущества и недостатки.
> 4) Я считаю что мое мнение ничуть не менее объективно чем твое.(думаю что и не более )
Что подразумевается под "моим мнением"? Я пока старался ничего не утверждать.
Несогласие с формулировками наподобие "никому не нужен" и "ФЯ -- это всего лишь..."
ещё не есть проявление какого-либо моего мнения.
А рассуждения относительно областей применения я готов корректировать,
универсальных средств не бывает.
> 5) Наличие людей, познакомившихся с ФП и у которых не изменилось представление
> о программировании( я например) тоже много о чем говорит.
О том, что ФП сложно для понимания?
Или о том, что эти люди не сумели соотнести абстракцию ФП с окружающей действительностью?
Или то, что в действительности ФП невостребовано?
Любые факты доказывают человеку только то, что он хочет видеть.
> 6) Может все-таки кинешь несколько ссылок?
Тут постили однажды lisp success story by P.Graham,. он на личном опыте рассказывал,
почему lisp может сильно порулить в startup'ах: http://www.paulgraham.com/avg.html
Ещё другие статьи: http://www.paulgraham.com/articles.html
Об особенностях восприятия: http://warrax.croco.net/Satan/Books/quantum/cover.htm
Откуда берутся знания и как промываются мозги: http://warrax.croco.net/51/evolution/cover.html
Ещё можно какую-нибудь философию почитать типа Поппер/Кун/Лакатос/Фейерабенд,
философия науки очень хорошо отображается на философию программизма.
Самые интересные вопросы в области сопоставления парадигм как раз относятся к философии и психологии,
нежели идиотизм "какой язык лучше?", так упорно развиваемый в этом треде.
> и что функциональное программирование - никому не нужная вещь?
Твоя категоричность -- явный признак фанатизма.
Мне не нравится мир, в котором нет ФП, да и в окружающей меня действительности ФП есть и нужен.
Но я могу легко себе предствить толпы его не использующих "real programmer'ов"
(т.е. в качестве почти никому не нужной вещи и даже представить, откуда эти толпы берутся.
Вообще, обладание дополнительными знаниями -- всегда бонус,
в отличие от уверенности в ненужности этих знаний.
> 2) Ты не хочешь показывать и доказывать по другим причинам.
> Прежде всего потому что таких проектов сейчас нет.
Опять категоричность.
darcs -- система распределённой коллективной разработки.
Написана на haskell, от конкурирующих систем отличается
в первую очередь наличием теоретической базы.
Если этот проект ждёт успех, то не удивлюсь, что haskell оттуда исчезнет.
> Раньше - были(тот же Symbolics. Но где он сейчас?).
> Сейчас специально прошвырнулся в Гугле.
> И действительно, есть проекты, написанные на Лиспе(или других ФЯ) -
> но это только системы вычислений(Maxima например) и AI.
То, что ты кратко сформулировал, в виде AI, можно сказать по другому:
трудно формализуемые задачи, где начиная работать над проектом невозможно
сказать, как должен выглядеть результат. В частности, обработка естественных
языков (самый большой проект на хаскеле -- 50k строк -- занимается обработкой китайского).
Как только задача формализуется в достаточной степени, её переписывают
на какой-нибудь c++, после чего она начинает работать быстро, но теряет
гибкость.
А прототипы некоторых систем долгое время живут исключительно в виде
программулек на ФЯ (или даже в виде математических формул
потому как ещё нет возможности перенести заложенную в них идею
в "настоящий" проект (понимание принципа работы и логика верхнего
уровня есть, а привязки к конкретным данным ещё нет).
В частности, программы для обработки других программ.
Я уже писал про отображение функционального представления в императивный код,
все известные мне примеры и проекты на ФЯ служат одним из этапов этого отображения:
сначала модель в голове/на бумаге/на ФЯ для эффективного представления идей,
потом промышленная реализация на ИЯ для эффективного отображения на аппаратуру.
Только некоторые модели живут в функциональном виде слишком долго,
дожидаясь эффективной реализации, а некоторым такое представление оказывается ненужным.
> 3) Ты не прав. Я готов поменять свое мнение. Но для этого нужна нормальная аргументация.
> Каковой я до сих пор не увидел
Нет. Нужна прежде всего не нормальная внешняя аргументация, а собственная мотивация.
Тем более речь идёт о сопоставлении различных парадигм, и аргументация здесь не поможет.
Нужно сначала самому увидеть, а потом уже оценить и сравнить.
Категоричность при этом должна исчезнуть: две реальности равноправны,
и в каждой из них можно жить, но у обеих есть преимущества и недостатки.
> 4) Я считаю что мое мнение ничуть не менее объективно чем твое.(думаю что и не более )
Что подразумевается под "моим мнением"? Я пока старался ничего не утверждать.
Несогласие с формулировками наподобие "никому не нужен" и "ФЯ -- это всего лишь..."
ещё не есть проявление какого-либо моего мнения.
А рассуждения относительно областей применения я готов корректировать,
универсальных средств не бывает.
> 5) Наличие людей, познакомившихся с ФП и у которых не изменилось представление
> о программировании( я например) тоже много о чем говорит.
О том, что ФП сложно для понимания?
Или о том, что эти люди не сумели соотнести абстракцию ФП с окружающей действительностью?
Или то, что в действительности ФП невостребовано?
Любые факты доказывают человеку только то, что он хочет видеть.
> 6) Может все-таки кинешь несколько ссылок?
Тут постили однажды lisp success story by P.Graham,. он на личном опыте рассказывал,
почему lisp может сильно порулить в startup'ах: http://www.paulgraham.com/avg.html
Ещё другие статьи: http://www.paulgraham.com/articles.html
Об особенностях восприятия: http://warrax.croco.net/Satan/Books/quantum/cover.htm
Откуда берутся знания и как промываются мозги: http://warrax.croco.net/51/evolution/cover.html
Ещё можно какую-нибудь философию почитать типа Поппер/Кун/Лакатос/Фейерабенд,
философия науки очень хорошо отображается на философию программизма.
Самые интересные вопросы в области сопоставления парадигм как раз относятся к философии и психологии,
нежели идиотизм "какой язык лучше?", так упорно развиваемый в этом треде.
Товарищ зачинщик, не пора ли в заголовок добавить «о ослиспленных счастьем функционального программирования»?
мнение....
Есть математики геометры, а есть алгеброиды. Могут решить одну и туже задачу подходя к ней с разных сторон. Они принципиально мыслят по разному. Также различием в мышлении отличаются математики от физиков или скажем инженеров. Математические рассуждения - рассуждения на уровне абстракций.
ФЯ - математики
математики - абстрактное мышление.
Понятно, что большенству инженеров сложно мыслить в рамках ФЯ. А людей с инженерным мышлением гораздо больше, чем с математическим. Отсюда прямо следует тот факт, что ФЯ не распространены в массах. Просто большенству проще научиться мыслить в рамках ИЯ. Но поскольку в ФЯ заложен больший уровень абстракции, то очевидно, что этоти языки более красивы и гибки (с точки зрения математика
).
Из этого превосходства вытекает минус - большая отдаленность от современных аппаратных средств и медленная скорость работы. Это вторая причина непопулярности. Но если аппаратно-техническая база принципиально изменится...?
Есть математики геометры, а есть алгеброиды. Могут решить одну и туже задачу подходя к ней с разных сторон. Они принципиально мыслят по разному. Также различием в мышлении отличаются математики от физиков или скажем инженеров. Математические рассуждения - рассуждения на уровне абстракций.
ФЯ - математики
математики - абстрактное мышление.
Понятно, что большенству инженеров сложно мыслить в рамках ФЯ. А людей с инженерным мышлением гораздо больше, чем с математическим. Отсюда прямо следует тот факт, что ФЯ не распространены в массах. Просто большенству проще научиться мыслить в рамках ИЯ. Но поскольку в ФЯ заложен больший уровень абстракции, то очевидно, что этоти языки более красивы и гибки (с точки зрения математика
).Из этого превосходства вытекает минус - большая отдаленность от современных аппаратных средств и медленная скорость работы. Это вторая причина непопулярности. Но если аппаратно-техническая база принципиально изменится...?
Восьмибитных - просто уйма. Во-первых куча на архитектуре i8051, и советских и не советских, есть даже очень интересные модификации, типа Atmel AT83C51SND1 (архитектура 8051, flash-пзу 64кб, mp3-декодер, аппаратная поддержка интерфейсов MMC/DataFlash/SmartMedia/CompactFlash, IDE, USB 1.1, голосовой кодек)
Во-вторых куча специфичных 8bit risc архитектур, типа того же Atmel AVR (для него, кстати, поддержка C++ ожидается даже вскоре в компиляторе GCC. поддержка C для архитектуры avr в gcc уже есть давно, и вполне конкурентноспособная с коммерческими компиляторами).
Во-вторых куча специфичных 8bit risc архитектур, типа того же Atmel AVR (для него, кстати, поддержка C++ ожидается даже вскоре в компиляторе GCC. поддержка C для архитектуры avr в gcc уже есть давно, и вполне конкурентноспособная с коммерческими компиляторами).
> Только некоторые модели живут в функциональном виде слишком
> долго, дожидаясь эффективной реализации, а некоторым такое
> представление оказывается ненужным.
А как ты оцениваешь будущее МЛ-ов?
---
...Я работаю антинаучным аферистом...
> долго, дожидаясь эффективной реализации, а некоторым такое
> представление оказывается ненужным.
А как ты оцениваешь будущее МЛ-ов?
---
...Я работаю антинаучным аферистом...
> Из этого превосходства вытекает минус - большая отдаленность
> от современных аппаратных средств и медленная скорость работы.
Вот как ты объяснишь такое дело, что "Эриксон," насколько помню,
для программирования СРВ предлагает Эрланг?
---
...Я работаю антинаучным аферистом...
> от современных аппаратных средств и медленная скорость работы.
Вот как ты объяснишь такое дело, что "Эриксон," насколько помню,
для программирования СРВ предлагает Эрланг?
---
...Я работаю антинаучным аферистом...
Наличие эффективных реализаций ML и популярность неэффективных Java
наводит на мысль, о том, что скорость работы перестаёт быть критичным параметром,
уступая переносимости, автоматической сборке мусора и прочим высокоуровневым полезностям.
(Разумеется, не везде такое верно.)
При такой тенденции, вероятно, можно ожидать сравнения характеристик языков
(если оно ещё не наступило а также продолжения заимствования императивными
языками свойств функциональных. Растущая сложность, например, приводит
к вопросу полуавтоматической проверки корректности, а для этого нужна матмодель
системы с хорошими свойствами. Ключевое свойство ФЯ - прозрачность по ссылкам -
здесь оказывается чуть ли не единственным спасением: если доказана корректность
(безопасность итп) работы модуля или шаблона приложения, то можно не опасаться
побочных эффектов при его использовании.
То же самое свойство позволяет избежать часть проблем при параллельном исполнении.
Впрочем, я не верю, что переворот в сознании сможет произойти быстро,
но свойства ФЯ будут являться востребованными ещё очень долго.
Нынешняя популярность мультипарадигмальных языков отчасти объясняется этим.
Что касается конкретных предсказаний, то OCaml в виде F# продвигается микрософтом,
так что шансы у него есть, сказать что-либо более конкретное про ML я вряд ли сейчас смогу.
наводит на мысль, о том, что скорость работы перестаёт быть критичным параметром,
уступая переносимости, автоматической сборке мусора и прочим высокоуровневым полезностям.
(Разумеется, не везде такое верно.)
При такой тенденции, вероятно, можно ожидать сравнения характеристик языков
(если оно ещё не наступило а также продолжения заимствования императивными
языками свойств функциональных. Растущая сложность, например, приводит
к вопросу полуавтоматической проверки корректности, а для этого нужна матмодель
системы с хорошими свойствами. Ключевое свойство ФЯ - прозрачность по ссылкам -
здесь оказывается чуть ли не единственным спасением: если доказана корректность
(безопасность итп) работы модуля или шаблона приложения, то можно не опасаться
побочных эффектов при его использовании.
То же самое свойство позволяет избежать часть проблем при параллельном исполнении.
Впрочем, я не верю, что переворот в сознании сможет произойти быстро,
но свойства ФЯ будут являться востребованными ещё очень долго.
Нынешняя популярность мультипарадигмальных языков отчасти объясняется этим.
Что касается конкретных предсказаний, то OCaml в виде F# продвигается микрософтом,
так что шансы у него есть, сказать что-либо более конкретное про ML я вряд ли сейчас смогу.
"Never you have enough RAM.
Never you have enough clock cycles."
Для императивных языков с хорошей блочной структурой отсутствие
побочных эффектов легко проверить и (полу)автоматически.
В отличие от возможности перестановки порядка вычислений.
Последнее, кстати, для оптимизации по скорости очень даже важно.
Про переносимость языков, в которых не описывается требуемая
разрядность, указано выше.
Да, в сторону увеличения разрядности переносить проще
(у меня здесь есть перенесённый код времён, наверное,
ПДП-8, с умножением 22-разрядных чисел кусками по 11 разрядов
но и тогда тоже есть пространство для игры: некоторый код
существенно использует ограничение по разрядности или
представление чисел дополнением до двух.
---
...Я работаю антинаучным аферистом...
Never you have enough clock cycles."
Для императивных языков с хорошей блочной структурой отсутствие
побочных эффектов легко проверить и (полу)автоматически.
В отличие от возможности перестановки порядка вычислений.
Последнее, кстати, для оптимизации по скорости очень даже важно.
Про переносимость языков, в которых не описывается требуемая
разрядность, указано выше.
Да, в сторону увеличения разрядности переносить проще
(у меня здесь есть перенесённый код времён, наверное,
ПДП-8, с умножением 22-разрядных чисел кусками по 11 разрядов
но и тогда тоже есть пространство для игры: некоторый код
существенно использует ограничение по разрядности или
представление чисел дополнением до двух.
---
...Я работаю антинаучным аферистом...
> Для императивных языков с хорошей блочной структурой отсутствие
> побочных эффектов легко проверить и (полу)автоматически.
Да, именно. Речь шла не о самих ФЯ, а о полезном свойстве ФЯ.
> побочных эффектов легко проверить и (полу)автоматически.
Да, именно. Речь шла не о самих ФЯ, а о полезном свойстве ФЯ.
> Если в первой и третьей у тебя записано одно умножение и одно деление,
Гон. И подтасовка фактов.
Ты же только, что приводил код, который запросто подменяет стандартные операции.
Соответственно, хоть в коде написанно одно умножение и одно деление - реально их вызов может выливаться, например, в форматирование винчестера - что является довольно ресурсоемкой операцией.
> то во второй неизвестно, сколько действий и каких.
Согласен, но про первую запись (с умножениями и делениями) можно сказать тоже самое.
> Например, о bzero, memcpy и т. п.
Зачем пользоваться этими низкоуровневыми операциями в реальных прикладных задачах?
Гон. И подтасовка фактов.
Ты же только, что приводил код, который запросто подменяет стандартные операции.
Соответственно, хоть в коде написанно одно умножение и одно деление - реально их вызов может выливаться, например, в форматирование винчестера - что является довольно ресурсоемкой операцией.
> то во второй неизвестно, сколько действий и каких.
Согласен, но про первую запись (с умножениями и делениями) можно сказать тоже самое.
> Например, о bzero, memcpy и т. п.
Зачем пользоваться этими низкоуровневыми операциями в реальных прикладных задачах?
> Если этот проект ждёт успех, то не удивлюсь, что haskell оттуда исчезнет.
Т.е. я правильно понял, что ФЯ непредназачен для использования в реальных условиях?
т.е. для ФЯ необходима специальная субкультура - несколько продвинутых фэнов ФЯ. Но как только в этой субкультуре появляется толпа (набегают "мухи" так сразу вся программа, написанная на ФЯ, разваливается
Т.е. я правильно понял, что ФЯ непредназачен для использования в реальных условиях?
т.е. для ФЯ необходима специальная субкультура - несколько продвинутых фэнов ФЯ. Но как только в этой субкультуре появляется толпа (набегают "мухи" так сразу вся программа, написанная на ФЯ, разваливается
> Как только задача формализуется в достаточной степени, её переписывают
> на какой-нибудь c++, после чего она начинает работать быстро, но теряет
> гибкость.
Зачем переписывают все? Почему не переписывают только критические участки кода? Как, например, поступают при использовании высокоуровневых языков.
> на какой-нибудь c++, после чего она начинает работать быстро, но теряет
> гибкость.
Зачем переписывают все? Почему не переписывают только критические участки кода? Как, например, поступают при использовании высокоуровневых языков.
> Вот как ты объяснишь такое дело, что "Эриксон," насколько помню,
> для программирования СРВ предлагает Эрланг?
Тем, что на ФЯ проще натягивается мат. аппарат, соответственно проще делаются всякие автоматические фичи.
Обращаю внимание на то, что фактически делается уступке машине, а не в сторону человека. Т.е. упрощается работа машины, но не человека.
Из того факта, что на ФЯ проще натягивается мат. аппарат никак не следует, что программы на ФЯ пишутся проще, и получаются лучше - никак не следует.
> для программирования СРВ предлагает Эрланг?
Тем, что на ФЯ проще натягивается мат. аппарат, соответственно проще делаются всякие автоматические фичи.
Обращаю внимание на то, что фактически делается уступке машине, а не в сторону человека. Т.е. упрощается работа машины, но не человека.
Из того факта, что на ФЯ проще натягивается мат. аппарат никак не следует, что программы на ФЯ пишутся проще, и получаются лучше - никак не следует.
>> Если этот проект ждёт успех, то не удивлюсь, что haskell оттуда исчезнет.
> Т.е. я правильно понял, что ФЯ непредназачен для использования в реальных условиях?
В "реальных условиях" есть требования заказчика и необходимость поддержки кода.
Поддерживать код на ФЯ сейчас сложно, но не потому, что язык для этого не предназначен,
а потому, что некому. Возможностей ФЯ достаточно для реализации многих проектов.
> т.е. для ФЯ необходима специальная субкультура - несколько продвинутых фэнов ФЯ.
> Но как только в этой субкультуре появляется толпа (набегают "мухи" так сразу вся программа, написанная на ФЯ, разваливается
Откуда взялся такой вывод?
> Т.е. я правильно понял, что ФЯ непредназачен для использования в реальных условиях?
В "реальных условиях" есть требования заказчика и необходимость поддержки кода.
Поддерживать код на ФЯ сейчас сложно, но не потому, что язык для этого не предназначен,
а потому, что некому. Возможностей ФЯ достаточно для реализации многих проектов.
> т.е. для ФЯ необходима специальная субкультура - несколько продвинутых фэнов ФЯ.
> Но как только в этой субкультуре появляется толпа (набегают "мухи" так сразу вся программа, написанная на ФЯ, разваливается
Откуда взялся такой вывод?
>> Если в первой и третьей у тебя записано одно умножение и одно деление,
> Гон. И подтасовка фактов.
Ты думаешь, что компилятор сей всегда проверяет на переполнение?
Или он после умножения оставляет промежуточный итог двойной разрядности?
>> то во второй неизвестно, сколько действий и каких.
> Согласен, но про первую запись (с умножениями и делениями) можно сказать тоже самое.
Да, если машина не имеет встроенного умножения,
то компилятор должен будет вставлять сложения и сдвиги.
В действительности же, происходит отсечение старших разрядов.
>> Например, о bzero, memcpy и т. п.
> Зачем пользоваться этими низкоуровневыми операциями в реальных прикладных задачах?
Хорошо.
strcmp, strcpy.
Да, а почему, кстати, остаток находится поразрядным "и"?
---
...Я работаю антинаучным аферистом...
> Гон. И подтасовка фактов.
Ты думаешь, что компилятор сей всегда проверяет на переполнение?
Или он после умножения оставляет промежуточный итог двойной разрядности?
>> то во второй неизвестно, сколько действий и каких.
> Согласен, но про первую запись (с умножениями и делениями) можно сказать тоже самое.
Да, если машина не имеет встроенного умножения,
то компилятор должен будет вставлять сложения и сдвиги.
В действительности же, происходит отсечение старших разрядов.
>> Например, о bzero, memcpy и т. п.
> Зачем пользоваться этими низкоуровневыми операциями в реальных прикладных задачах?
Хорошо.
strcmp, strcpy.
Да, а почему, кстати, остаток находится поразрядным "и"?
---
...Я работаю антинаучным аферистом...
>> Как только задача формализуется в достаточной степени, её переписывают
>> на какой-нибудь c++, после чего она начинает работать быстро, но теряет
>> гибкость.
> Зачем переписывают все? Почему не переписывают только критические участки кода?
Переписывают всё, когда возникает необходимость переписать всё.
Про требования заказчиков и поддержку я уже написал.
> Как, например, поступают при использовании высокоуровневых языков.
ФЯ -- высокоуровневые. И они всё это делать позволяют.
>> на какой-нибудь c++, после чего она начинает работать быстро, но теряет
>> гибкость.
> Зачем переписывают все? Почему не переписывают только критические участки кода?
Переписывают всё, когда возникает необходимость переписать всё.
Про требования заказчиков и поддержку я уже написал.
> Как, например, поступают при использовании высокоуровневых языков.
ФЯ -- высокоуровневые. И они всё это делать позволяют.
Ещё раз, проверить отсутствие побочных эффектов в Аде не
настолько уж и сложно.
Ада, конечно, не Си, но является императивным языком.
Может, всё-таки, дело в другом?
---
...Я работаю антинаучным аферистом...
настолько уж и сложно.
Ада, конечно, не Си, но является императивным языком.
Может, всё-таки, дело в другом?
---
...Я работаю антинаучным аферистом...
> Ты думаешь, что компилятор сей всегда проверяет на переполнение?
> Или он после умножения оставляет промежуточный итог двойной разрядности?
1. Замечание важно только в контексте расчетных задач. В реальных задачах, даже в бухгалтерии - таких проблем нет.
2. Да, C-компилятор не отслеживает ошибки переполнения. И что дальше? Как из этого следует, что программы на ФЯ пишутся проще?
> strcmp, strcpy.
хм... Это тоже низкоуровневые команды. И в реальных прикладных программах опять же обычно не используются, и не рекомендуются для использования.
> Да, а почему, кстати, остаток находится поразрядным "и"?
Низкая квалификация (привычка) данного конкретного программиста?
> Или он после умножения оставляет промежуточный итог двойной разрядности?
1. Замечание важно только в контексте расчетных задач. В реальных задачах, даже в бухгалтерии - таких проблем нет.
2. Да, C-компилятор не отслеживает ошибки переполнения. И что дальше? Как из этого следует, что программы на ФЯ пишутся проще?
> strcmp, strcpy.
хм... Это тоже низкоуровневые команды. И в реальных прикладных программах опять же обычно не используются, и не рекомендуются для использования.
> Да, а почему, кстати, остаток находится поразрядным "и"?
Низкая квалификация (привычка) данного конкретного программиста?
> Может, всё-таки, дело в другом?
Да, в другом. Потому что C - априори является низкоуровневым языком.
Позже была предпринята очень удачная попытка добавления высокоуровневых средств, что привело к созданию языка - C++.
Но дальнейшее развитие C++ было подорвано тем, что в C++ так и не устранили ряд существенных недостатков C (отсутствие модулей, отсутствие безопасного режима, отсутствие метаданных и т.д.)
Да, в другом. Потому что C - априори является низкоуровневым языком.
Позже была предпринята очень удачная попытка добавления высокоуровневых средств, что привело к созданию языка - C++.
Но дальнейшее развитие C++ было подорвано тем, что в C++ так и не устранили ряд существенных недостатков C (отсутствие модулей, отсутствие безопасного режима, отсутствие метаданных и т.д.)
Можно глупый вопрос? Почему у меня этот цикл не даёт аутпута:
for (s = 1; s < ULONG_MAX; s++)
if x = s & 0xffffffffUL) == 0)
printf("Found: %lu\a\n", s);
<= ULONG_MAX?
All works
All works

условие s<=ULONG_MAX никогда не может быть ложным - выхода из цикла не будет.
Это всё равно, что попробовать сделать такой цикл:
и орёт она, когда цикл на второй заход идёт.
для сравнения, можно попробовать такой вариант:
теперь я уже скажу, что All Works, то бишь ничего не печатается
Это всё равно, что попробовать сделать такой цикл:
for(unsigned s=10;s>=-10;s--)
и орёт она, когда цикл на второй заход идёт.
для сравнения, можно попробовать такой вариант:
unsigned long s,x,s1;
for (s = 0; s < ULONG_MAX; s++)
{
s1=s+1;
if x = s1 & 0xffffffffUL) == 0)
printf("Found: %lu\a\n", s1);
}
теперь я уже скажу, что All Works, то бишь ничего не печатается

sizeof(long) == ?
"...Отрубил Иван-Царевич ему 32768 голов, и умер Змей Горыныч.
Потому что был он шестнадцатиразрядным."
Здесь "uname -prs" выдаёт "FreeBSD 5.2.1-RELEASE i386".
Ты тоже веришь в то, что 2^{32}, два в тридцать второй степени, равно нулю?
---
...Я работаю антинаучным аферистом...
Потому что был он шестнадцатиразрядным."
#include <stdio.h>
main(void)
{
unsigned long a,i;
for(a=1,i=0; i<36; a*=2, i++) printf("%u %u\n", i, a);
printf("%d %d\n", sizeof(int sizeof(long;
return 0;
}
Здесь "uname -prs" выдаёт "FreeBSD 5.2.1-RELEASE i386".
Ты тоже веришь в то, что 2^{32}, два в тридцать второй степени, равно нулю?
---
...Я работаю антинаучным аферистом...
Верю.
А также я верю в то, что 1e200*1e200 равно INF для double, или вывалит программу с FPE (зависит от настроек ядра).
А также я верю в то, что 1e200*1e200 равно INF для double, или вывалит программу с FPE (зависит от настроек ядра).
> Верю.
Зря веришь, на 64-битной машине - long скорее всего будет 64-разрядным
Зря веришь, на 64-битной машине - long скорее всего будет 64-разрядным
Здесь "uname -prs" выдаёт "FreeBSD 5.2.1-RELEASE i386".
Маза, что, например, такая FreeBsd-я запустится на Атлоне-64.
При этом программы на такой системе могут компилироваться и работать в 64-битном режиме.
При этом программы на такой системе могут компилироваться и работать в 64-битном режиме.
Перечитай заголовок.
---
...Я работаю антинаучным аферистом
---
...Я работаю антинаучным аферистом
но из примера видно, что запускалось в таком environment, где unsigned long был 32-битным.
стандарт требует, только то, что тип unsigned long должен быть достаточно большим, чтобы вмещать числа 0..4294967295, а уж его реальный размер - внутреннее дело компилятора, хоть 33-х битный.
вполне законно использовать константу ULONG_MAX, которая и определяет, какое максимальное значение может принимать переменная типа unsigned long. глупо ожидать от переменной такого типа, что она превзойдёт эту константу.
2КОНТРА: в заголовке ничего не понял. нормальная конструкция, нормальная проверка. монопенисуально проверять s на входе или x на выходе, если после этого места s не используется.
стандарт требует, только то, что тип unsigned long должен быть достаточно большим, чтобы вмещать числа 0..4294967295, а уж его реальный размер - внутреннее дело компилятора, хоть 33-х битный.
вполне законно использовать константу ULONG_MAX, которая и определяет, какое максимальное значение может принимать переменная типа unsigned long. глупо ожидать от переменной такого типа, что она превзойдёт эту константу.
2КОНТРА: в заголовке ничего не понял. нормальная конструкция, нормальная проверка. монопенисуально проверять s на входе или x на выходе, если после этого места s не используется.
Тогда перечитывай всю ветку.
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
Karel Capek
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
Karel Capek
нах надо по третьему разу читать.
Совершенно ясно следующее:
Совершенно ясно следующее:
- тебе чем-то не нравится С++, (это товё имхо)
- утверждается что он не будет жить в тех средах, где живёт скажем лисп, (что не верно. эта КР580ИК80 - в каком году сделана? Какие устройства на ней работают? Когда стандарт на С++ появился? Не кажется ли что это что-то вроде утверждения: "А вот алгол круче, потому что на нём мы могли писать для ЕС1033" ? - кстати, этот МПК использовался в ЭВМ этих серий)
- и что вроде как на твоём любимом языке арифметика будет выглядеть красивее.
> в заголовке ничего не понял. нормальная конструкция, нормальная проверка. монопенисуально проверять s на входе или x на выходе, если после этого места s не используется.
Исходя из тех данных, что данны в первом сообщения тот же кусок кода из первого сообщения содержит ошибку.
Ощибка следующая: при компиляции кода под 64-битную платформу x на выходе может принимать значение 0, что противоречит требованию x не должно принимать значение 0.
Исходя из тех данных, что данны в первом сообщения тот же кусок кода из первого сообщения содержит ошибку.
Ощибка следующая: при компиляции кода под 64-битную платформу x на выходе может принимать значение 0, что противоречит требованию x не должно принимать значение 0.
т.е. ошибка в коде из первом поста есть, но далее КОНТРА утверждает, что это ошибка навязанна самим C/C++ и что на других языках такой ошибки не будет.
Но при этом КОНТРА так и не показал какие средства в "других" языках позволят избежать данной ошибки, т.е. никак не показал, что тот же самый программист (еще раз подчеркиваю - тот же самый) не допустит такой же ошибки на других языках.
Но при этом КОНТРА так и не показал какие средства в "других" языках позволят избежать данной ошибки, т.е. никак не показал, что тот же самый программист (еще раз подчеркиваю - тот же самый) не допустит такой же ошибки на других языках.
Это не только моё мнение.
Некоторым упёртым, слепо верящим в неотличимость 32-й степени двойки от нуля,
надо бы попереносить кучу обычного, казалось бы, кода на 16 разрядов и на 64 разряда.
Ибо нефиг машинозависимый код называть переносимым.
---
...Я работаю антинаучным аферистом...
Некоторым упёртым, слепо верящим в неотличимость 32-й степени двойки от нуля,
надо бы попереносить кучу обычного, казалось бы, кода на 16 разрядов и на 64 разряда.
Ибо нефиг машинозависимый код называть переносимым.
---
...Я работаю антинаучным аферистом...
Эта ошибка навязана именно языком.
Основания:
а) двойное представление целых чисел в виде собственно чисел,
и в виде цепочек двоичных разрядов, с соответствующими
допустимыми действиями над ними;
б) поощрение использования представления целых чисел в виде дополнения до двух;
в) полное отсутствие средств управления переполнением в действиях,
производимых над целыми числами.
Легко встретить другие языки, где:
а) нет легкодоступного представления чисел в виде цепочек двоичных разрядов;
б) надо отдельно объяснить компилятору, что ты хакер
и собираешься работать напрямую с машинным представлением данных;
в) есть возможность явного задания требуемых границ для целых значений;
г) поощряется явное задание этих границ;
д) можно получить границы по умолчания в рамках самого языка,
а не языка текстового препроцессора;
е) есть встроенные средства борьбы с переполнением;
ё) есть возведение в степень.
А ещё в этих языках разделено взятия остатка от деления
с округлением к нулю и с округлением вниз.
Насильники разницы в этих действиях, очевидно, не усматривают.
---
...Я работаю антинаучным аферистом...
Основания:
а) двойное представление целых чисел в виде собственно чисел,
и в виде цепочек двоичных разрядов, с соответствующими
допустимыми действиями над ними;
б) поощрение использования представления целых чисел в виде дополнения до двух;
в) полное отсутствие средств управления переполнением в действиях,
производимых над целыми числами.
Легко встретить другие языки, где:
а) нет легкодоступного представления чисел в виде цепочек двоичных разрядов;
б) надо отдельно объяснить компилятору, что ты хакер
и собираешься работать напрямую с машинным представлением данных;
в) есть возможность явного задания требуемых границ для целых значений;
г) поощряется явное задание этих границ;
д) можно получить границы по умолчания в рамках самого языка,
а не языка текстового препроцессора;
е) есть встроенные средства борьбы с переполнением;
ё) есть возведение в степень.
А ещё в этих языках разделено взятия остатка от деления
с округлением к нулю и с округлением вниз.
Насильники разницы в этих действиях, очевидно, не усматривают.
---
...Я работаю антинаучным аферистом...
>Ибо нефиг машинозависимый код называть переносимым.
нефиг собственные ошибки и заблуждения ретранслировать на других
плюсы допускают написание машинонезависимого кода, а некоторые спешат сделать вывод, что любой подсунутый им код на плюсах тут же становится платформонезависимым
нефиг собственные ошибки и заблуждения ретранслировать на других
плюсы допускают написание машинонезависимого кода, а некоторые спешат сделать вывод, что любой подсунутый им код на плюсах тут же становится платформонезависимым

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

Математики идут изучать жизнь:
1. ANSI X3.215-1994, ISO/IEC 15145:1997.
2. ANSI/MIL-STD-1815A-1983, ISO/IEC 8652:1995.
---
...Я работаю антинаучным аферистом...
1. ANSI X3.215-1994, ISO/IEC 15145:1997.
2. ANSI/MIL-STD-1815A-1983, ISO/IEC 8652:1995.
---
...Я работаю антинаучным аферистом...
Ещё раз.
Да, можно написать переносимый код.
Его можно написать на чём угодно.
У меня есть образец замечательно переносимого кода,
расчитанного на не менее, чем 12-разрядные машины.
---
...Я работаю антинаучным аферистом...
Да, можно написать переносимый код.
Его можно написать на чём угодно.
У меня есть образец замечательно переносимого кода,
расчитанного на не менее, чем 12-разрядные машины.
---
...Я работаю антинаучным аферистом...
> Основания:
> а) двойное представление целых чисел в виде собственно чисел,
> и в виде цепочек двоичных разрядов, с соответствующими
> допустимыми действиями над ними;
> б) поощрение использования представления целых чисел в виде дополнения до двух;
> в) полное отсутствие средств управления переполнением в действиях,
> производимых над целыми числами.
Еще раз повторю: C - изначально создавался именно, как "переносимый ассемблер".
Все добавления в C вызваны как раз тем, что C - это ассемблер.
Процессор по-разному работает с большими и маленькими числами, различает signed и unsigned => соответственно все тоже самое появилось в C.
процессор умеет оптимальнее работать с числами дополненных до двух => в C также добавлены эти же команды
Процессор умеет сообщать об ошибке переполнения, но это не получается встроить в процедурную модель "много входных данных->один(или меньше) результат" =>- значит нафиг такую ошибку.
Процессор умеет проводить битые операции => Ок, их тоже добавляют в C
Процессор не умеет возводить в степень - нафиг такую функциональность
Процессор не умеет оперировать числами с произвольной разрядностью - нафиг такую функциональность
Процессор не умеет оперировать ограниченными числами - нафиг такую функциональность
Т.е. при разработке языка в первую очередь руководствовались лозунгом "Что умеет машина?", а не "что хочет человек?".
Соответственно получился хороший язык, но удобный, в первую очередь, для системных программистов, но т.к. в то время большое число программистов - даже решающих прикладные задачи, приходилось писать системный код, то язык был очень востребован.
> а) двойное представление целых чисел в виде собственно чисел,
> и в виде цепочек двоичных разрядов, с соответствующими
> допустимыми действиями над ними;
> б) поощрение использования представления целых чисел в виде дополнения до двух;
> в) полное отсутствие средств управления переполнением в действиях,
> производимых над целыми числами.
Еще раз повторю: C - изначально создавался именно, как "переносимый ассемблер".
Все добавления в C вызваны как раз тем, что C - это ассемблер.
Процессор по-разному работает с большими и маленькими числами, различает signed и unsigned => соответственно все тоже самое появилось в C.
процессор умеет оптимальнее работать с числами дополненных до двух => в C также добавлены эти же команды
Процессор умеет сообщать об ошибке переполнения, но это не получается встроить в процедурную модель "много входных данных->один(или меньше) результат" =>- значит нафиг такую ошибку.
Процессор умеет проводить битые операции => Ок, их тоже добавляют в C
Процессор не умеет возводить в степень - нафиг такую функциональность
Процессор не умеет оперировать числами с произвольной разрядностью - нафиг такую функциональность
Процессор не умеет оперировать ограниченными числами - нафиг такую функциональность
Т.е. при разработке языка в первую очередь руководствовались лозунгом "Что умеет машина?", а не "что хочет человек?".
Соответственно получился хороший язык, но удобный, в первую очередь, для системных программистов, но т.к. в то время большое число программистов - даже решающих прикладные задачи, приходилось писать системный код, то язык был очень востребован.
> Еще раз повторю: C - изначально создавался именно, как
> "переносимый ассемблер".
...Для PDP-11.
> Процессор по-разному работает с большими и маленькими числами,
> различает signed и unsigned => соответственно все тоже самое
> появилось в C.
Одновременно со следующим?
> процессор умеет оптимальнее работать с числами дополненных до
> двух => в C также добавлены эти же команды
> Процессор умеет сообщать об ошибке переполнения, но это не
> получается встроить в процедурную модель "много входных
> данных->один(или меньше) результат" =>- значит нафиг такую
> ошибку.
В ещё более простом ПЛ/М есть "CARRY".
> Процессор не умеет возводить в степень - нафиг такую функциональность
LSI-11 ещё и умножать не умеет.
> Процессор не умеет оперировать числами с произвольной
> разрядностью - нафиг такую функциональность
В отличие от умножения, сложение с переносом
есть в фон-неймановских машинах всегда.
Сложение чисел двойной, тройной и т. д. разрядности
сделать куда проще, чем умножение.
Ада тоже разработан как "переносимый ассемблер."
Причём разработан именно как переносимый.
И разработан с учётом программирования систем.
Однако, таких извратов с двойным представлением нет.
Ещё тебе никто не мешает использовать подмножества языка.
Например, так, как это делали с ПЛ/1.
В котором тоже давно есть объявление разрядности чисел.
---
...Я работаю антинаучным аферистом...
> "переносимый ассемблер".
...Для PDP-11.
> Процессор по-разному работает с большими и маленькими числами,
> различает signed и unsigned => соответственно все тоже самое
> появилось в C.
Одновременно со следующим?
> процессор умеет оптимальнее работать с числами дополненных до
> двух => в C также добавлены эти же команды
> Процессор умеет сообщать об ошибке переполнения, но это не
> получается встроить в процедурную модель "много входных
> данных->один(или меньше) результат" =>- значит нафиг такую
> ошибку.
В ещё более простом ПЛ/М есть "CARRY".
> Процессор не умеет возводить в степень - нафиг такую функциональность
LSI-11 ещё и умножать не умеет.
> Процессор не умеет оперировать числами с произвольной
> разрядностью - нафиг такую функциональность
В отличие от умножения, сложение с переносом
есть в фон-неймановских машинах всегда.
Сложение чисел двойной, тройной и т. д. разрядности
сделать куда проще, чем умножение.
Ада тоже разработан как "переносимый ассемблер."
Причём разработан именно как переносимый.
И разработан с учётом программирования систем.
Однако, таких извратов с двойным представлением нет.
Ещё тебе никто не мешает использовать подмножества языка.
Например, так, как это делали с ПЛ/1.
В котором тоже давно есть объявление разрядности чисел.
---
...Я работаю антинаучным аферистом...
И много ты знаешь используемых операционных систем, написанных на PL/1?
Это к слову о системности (низкоуровности) языка.
ps
Все основные операционки написаны на C/C++.
ззы
MacOs (как старый, так и новый) интересно тоже на C/C++ написан?
Это к слову о системности (низкоуровности) языка.
ps
Все основные операционки написаны на C/C++.
ззы
MacOs (как старый, так и новый) интересно тоже на C/C++ написан?
что именно в данных документах тебя так заинтересовало? 

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

Если учесть, что VM/360 и VMS используются до сих пор, то системное ПО,
написанное на ПЛ-1 ещё в действии.
---
"Narrowness of experience leads to narrowness of imagination."
Rob Pike
написанное на ПЛ-1 ещё в действии.
---
"Narrowness of experience leads to narrowness of imagination."
Rob Pike
Оставить комментарий
Ivan8209
Переменные s и x объявлены как "unsigned long int."Переменная s предполагается берущейся произвольно.
Например, считыванием показаний часов.
Она принимает произвольные допустимые значения.
Переменная x ни при каких условиях не должна оказаться нулевой.
"Ни при каких" означает именно "ни при каких" и ничего более.
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
Karel Capek