LINUX.ORG.RU
ФорумTalks

Ну почему люди используют столь отстойные языки?!


0

0

Показали нам однажды на лекции пример макроопределения.

#define MIN(x,y) ((x) < (y) ? (x) : (y))

Ежу, читавшему On Lisp, понятно, что пример бажный (может произойти 
множественное вычисление аргументов). При этом, в мануале по cpp 
написано, что в стандартном С такой баг пофиксить невозможно.

На лиспе корректное определение выглядит так

(defmacro my-min (x y)
  (let ((x1 (gensym))
	(y1 (gensym)))
    `(let ((,x1 ,x)
	   (,y1 ,y))
       (if (< ,x1 ,y1)
	   ,x1
	   ,y1))))


А еще и говорят, что на С даже ногу можно прострелить... :/ А каком
 простреле ноги может идти речь, если даже с элементарными задачами 
язык справится не может?

Ответ на: комментарий от nsav-ng

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

GameMagister
()
Ответ на: комментарий от unDEFER

> А чем тебя здешний for не устраивает?

Слишком примитивен. Ты, я вижу, так и не удосужился прочитать мою ссылку.

> Угу, вот в таких нельзя

Неправильный ответ. Думай дальше.

> Самый первый твой пример являлся макросом на C с возможным множественным вычислением.

Уже привел. Только я не знаю, как этот макрос на cpp реализовать, но это уже не мои проблемы.

nsav-ng
() автор топика
Ответ на: комментарий от GameMagister

> Да и вообще нормалный порядок редукции рулит ибо там с этими вопросами заморачиваешься по минимому

с другой стороны проблема с дублирующими вычислениями как в исходном примере там актуальна (если оптимизатор слабый).

GameMagister
()
Ответ на: комментарий от anonymous

> Или если не ожидается то вроде как ничто не мешает этого предусмотреть

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

nsav-ng
() автор топика
Ответ на: комментарий от GameMagister

> loop можно орагизовать и как функцию или квотирование в лиспе уже отменили ?

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

> Да и вообще нормалный порядок редукции рулит ибо там с этими вопросами заморачиваешься по минимому

Никто не спорит, но иногда императивные алгоритмы более естественны, чем их функциональные аналоги.

nsav-ng
() автор топика
Ответ на: комментарий от nsav-ng

> Слишком примитивен.

Ну, конечно... А давай лисп с bash'ем сравним? Lisp совершенное убожество в сравнении с BASH :-)

unDEFER ★★★★★
()
Ответ на: комментарий от unDEFER

> Ну, конечно... А давай лисп с bash'ем сравним? Lisp совершенное убожество в сравнении с BASH :-)

Давай. Сравнивай. Только с башем, а не с юниксовскими утилитами, которые формально можно и из лиспа вызывать. :))

nsav-ng
() автор топика
Ответ на: комментарий от nsav-ng

> Только с башем, а не с юниксовскими утилитами, которые формально можно и из лиспа вызывать. :))

Нет, нет именно с BASH+все утилиты.
Вот, например как выдвинуть лоток CD-ROM В Lisp? В BASH элементарно:
eject.

И не надо предлагать тоже запустить утилиту eject -- я же не предлагаю из C вызывать интерпретатор Lisp :-)

unDEFER ★★★★★
()
Ответ на: комментарий от nsav-ng

Важно лишь это:

"Any sufficiently complicated C or Fortran program contains an ad-hoc, informally-specified bug-ridden slow implementation of half of Common Lisp."

nsav-ng
() автор топика
Ответ на: комментарий от nsav-ng

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

Это просто конкретно увеличит геморой и тем не менее теоретической возможности использовать loop как функцию не убирает =) На крайняк само окружение можно тоже передать в loop

GameMagister
()
Ответ на: комментарий от nsav-ng

Знакомое и вызывающе неверное утверждение:
библиотеки рулят!
Или использование любой библиотеки тоже будет считаться частью проекта?

unDEFER ★★★★★
()

Ладно, уговорил, С ацтой. Изготовь ядро системы на лиспе, а то после приведённых тобою неоспоримых аргументов даже думать противно, что ядро, самое сокровенное системы, написано на такой мерзззости :E~. Перепишеш ядро, всякие там глибцы, про Х не забудь, ну другое там по мелочи, приди тогда и скажи: вот так надо, посмотрите все как это работает быстро и безглючно, и как мало ресурсов ес! Вот тогда мы тя послушаем, выкинем поганое С фтопку, жабу сверху и станем сидеть все возле компов, лиспобыдлокодить такие вумные и жысти по выходным радоваться.

bugmaker ★★★★☆
()
Ответ на: комментарий от GameMagister

> Это просто конкретно увеличит геморой и тем не менее теоретической возможности использовать loop как функцию не убирает =)

Это будет уже не тот loop, поэтому убирает.

> На крайняк само окружение можно тоже передать в loop

В функцию?

nsav-ng
() автор топика
Ответ на: комментарий от GameMagister

> Ага. Как (символ,значение). В функции его воссоздать

Код напиши, а то я торможу чего-то.

nsav-ng
() автор топика
Ответ на: комментарий от GameMagister

> Это те, кто перепишут все что есть с си на лисп ?

Нет, это компьютеры, на которых все ПО было написано на Лиспе. В книжке "Хакеры -- герои компьютерной революции" о них хорошо написано.

nsav-ng
() автор топика
Ответ на: комментарий от bugmaker

> Слышал, но не видел. Гм, слака на их пойдёт?

Если ты ее перепишешь на лиспе, то да. ;)

А вообще, я точно не знаю, есть ли сейчас еще такие машинки, или только в музеях пылятся.

nsav-ng
() автор топика

Почти в тему: мне тут препод сказал, что моя программа на С плохо читаеться из-за макр, типа если бы неписал просто функциями (не беда что будет повторение кода) было бы нагляднее...

CrazyPit ★★★
()
Ответ на: комментарий от CrazyPit

О. Привет. давно тебя не было. :)

Кстати, селектер проапгрейдил у себя sbcl, теперь там работает и swank и aserve. В принципе, cliki тоже работает. Если тебе все это еще интересно, то свяжись со мной.

> мне тут препод сказал, что моя программа на С плохо читаеться из-за макр

В comp.lang.lisp один чел прокомментировал подобное высказывание так:

----

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

Давайте откажемся от функций. А то ведь, когда читаешь программу, постоянно приходится отвлекаться и вспоминать, что же делает та или иная функция.

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

----

Надеюсь, сарказм всем понятен :)

nsav-ng
() автор топика
Ответ на: комментарий от nsav-ng

Значит в музеум Лисповые компы говориш сдали?..

Кстати, глянь в http://www.linux.org.ru/jump-message.jsp?msgid=1080031 там я привёл простенькую задачу и пример ея решения на С. Предложи решение на Лисп с всякими грамматиками, всякими встроенными прологами и прочими ништяками, сравним смоим по сложности написания, поюзанным ресам и скоростивыполнения чтобы не быть голословными. А то брат nackyga с того треда куда-то свалил, наверное пытался украсть лисп-машину из музея но застрял с нею в дверях или ещё что-нибудь. Задачка заведомо из той области, к которой С не обращает самые сильные свои стороны однако.

bugmaker ★★★★☆
()
Ответ на: комментарий от nsav-ng

Глупости. Должен быть разумный баланс между гибкостью языка и "выкручиванием рук" программисту, чтобы он ничего опасного не сделал. Макросы - это не просто где-то далеко за пределами баланса, макросы находятся на бесконечности на шкале потенциальных возможностей языка. Так что они просто по определению - чистое зло. Я тут только что дал ссылку на обсуждение того самого разумного баланса - аспектов. Ознакомьтесь. И не скатывайтесь в пустую демагогию, пожалуйста.

MAPA3MATuK
()
Ответ на: комментарий от nsav-ng

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

1) есть в начале цифра

2) вторая буква "у", а всего букв три

3) есть твёрдый знак после гласной

Вызывается функции case1(), case2(), case3() соответственно. Если выполняется больше одного случяя, вызывается только одна из функций case, приоритет указан перечислением случяев, например из-за слова "хуъ" вызвана будет только case2(). Для теста, предлагаю функции case выводящими один символ-свой номер в stdout.

bugmaker ★★★★☆
()
Ответ на: комментарий от nsav-ng

Ты там есть жывой? Ладно, я спать.

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

bugmaker ★★★★☆
()
Ответ на: комментарий от bugmaker

(defmacro defcase (n)
  `(defun ,(intern (concatenate 'string "CASE" (format nil "~a" n))) ()
     (format t "~a~&" ,n)))

(defcase 1)
(defcase 2)
(defcase 3)

(defun vowel-p (char)
  (find char (list #\у #\е #\о)))

(defun strange (string)
  (labels ((check (i)
	     (and (eql (aref string i) #\ъ)
		  (vowel-p (aref string (1- i))))))
	     (cond
	       ((digit-char-p (aref string 0)) (case1))
	       ((and (= (length string) 3) (eql (aref string 1) #\у) (case2)))
	       ((or (check 1) (check 2)) (case3)))))

Только в отличии от твоего, это полностью рабочий код, так что не надо 3.14здеть про количество строк. 
Однострочник я писать не хочу, хотя это и возможно. Но не нужно.

nsav-ng
() автор топика
Ответ на: комментарий от anonymous

>Помедитируй над тем, во что развернётся:

>min(readint(file),readint(file));

В readint(file) ? :-D

PashaKustov ★★
()
Ответ на: комментарий от MAPA3MATuK

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

nsav-ng
() автор топика
Ответ на: комментарий от nsav-ng

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

А теперь смотрим сюда и плачем от ужаса:

http://www.willamette.edu/~fruehr/haskell/evolution.html

MAPA3MATuK
()
Ответ на: комментарий от MAPA3MATuK

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

Begemoth ★★★★★
()
Ответ на: комментарий от MAPA3MATuK

Не ты не маразматик, ты просто дебил.

1. Эквивалент Parsec на C в студию.

2. Ты юмора не понимаешь.

ЗЫ: На твоем правильном С любое действие можно выполнить n способами и получить segfault.

Begemoth ★★★★★
()

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

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

fghj ★★★★★
()
Ответ на: комментарий от Begemoth

Я не считаю Си сугубо правильным - Java и Python в этом отношении гораздо более чистые и кошерные.

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

MAPA3MATuK
()
Ответ на: комментарий от nsav-ng

Ты действительно считаеш этот код удобочитаемым? Хм, ну ладно, на вкус и цвет как говорится...

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

> так что не надо 3.14здеть про

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

> Однострочник я писать не хочу, хотя это и возможно. Но не нужно.

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

bugmaker ★★★★☆
()
Ответ на: комментарий от anonymous

>Чушь бредишь. Тебе будет непонятна запись на любом неизвестном тебе языке. Так что ты просто заявил, что Лисп нераспространён потому, что его никто не знает. Тавтология-с.

Поясняю. Запись 2+2 мне более понятна, чем + 2 2.Я не одинок, так как на заборах пишут коля + оля = Л и никак иначе ;)

guardian
()
Ответ на: комментарий от MAPA3MATuK

На Haskell НИКТО НЕ ЗАСТАВЛЯЕТ писать в стиле unlambda посмотри на те же библиотеки комбинаторов - на реальный код на Haskell.

ЗЫ: я все еще жду эквивалента Parsec на C.

Begemoth ★★★★★
()
Ответ на: комментарий от nsav-ng

Нда. И эти люди запрещают нам множественное наследование! x+++++x for ever!

Shaman007 ★★★★★
()

nsav-ng - А ты вообще понимаешь, что своими постами ты компрометируешь в глазах общественности всех лисперов? Получается что они настолько невоспитанны, что только и могут подмигивая пурпурными глазами кричать "все кроме лиспа ацтой!" (ну еще девушек не любят :D ). Так когдато появились стереотипы на джентушников, но ты как я понимаю решил развить эту "славу" и на поклонников лиспа?

Orlangoor ★★★★★
()
Ответ на: комментарий от Orlangoor

> nsav-ng - А ты вообще понимаешь, что своими постами ты компрометируешь в глазах общественности всех лисперов?

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

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от Begemoth

> > Я не одинок, так как на заборах пишут коля + оля = Л и никак иначе ;)

> Это временно %-)

ага. скоро будут писать (defmacro Л '(+, коля, оля))

ananas ★★★★★
()
Ответ на: комментарий от Begemoth

ЛОЛ! Теперь ночью точно присниться как иду я по улице а там на заборах написано:

(lovep Коля Маша)
t

(был здесь вася)
6.06.99

и.т.д.

CrazyPit ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.