LINUX.ORG.RU

Зачем нужны були?

 , ,


0

3

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

Все знают, наверное, lambda-like определение if-then-else. Вот один из вариантов:

(define t (lambda(x y) (x)))
(define f (lambda(x y) (y)))
(define if_ (lambda(a b c) (a b c)))

(if_ t (lambda() (write 'foo)) (lambda() (write 'bar))) ; foo
(if_ f (lambda() (write 'foo)) (lambda() (write 'bar))) ; bar
Тут есть даже псевдо-лень, как видим, причом безо всякой меты.

Что тут бросается в глаза в первую очередь? То, что if тут является пятым колесом. Он ничего не делает, и, по сути, нахер не нужен.

(t (lambda() (write 'foo)) (lambda() (write 'bar))) ; foo
И тут возникает вопрос: а при чем тут вообще логика? Мы ведь можем t заменить любой другой ф-цией, которая будет делать что-то другое, например, складывать результаты. Это обычная ф-ция, как и миллионны других. Абсолютно очевидно, что для програмирования були-свистули — это просто сахар, который не имеет отношения к программированию. Логика программы находится в голове программиста, а не в тексте программы.

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



Последнее исправление: anonimous (всего исправлений: 2)

когда ж ты свалишь обратно на борды...

anonymous
()

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

молодец. Открою Страшную Тайну: кроме функций НИЧЕГО НЕ НУЖНО.

Впрочем, все эти ваши лябды/монады тоже не нужны. Достаточно всего 8 операторов, как в brain fuck. Это доказано.

PS:


--[+++++++<---->>-->+>+>+<<<<]
<.>++++[-<++++<++>>>->--<<]>>-.>--..>+.<<<.<<-.>>+>->>.+++[.<]<<++.
emulek
()
Ответ на: комментарий от anonimous

Я бы сказал, на природе. На естественных процессах

если человек дурак, то это надолго.

подумай: при чём тут були?

emulek
()

Что тут бросается в глаза в первую очередь? То, что if тут является пятым колесом. Он ничего не делает, и, по сути, нахер не нужен.

Только если представлять t и f таким странным образом. Если нет, то нужен. И для практических целей создания оптимизированных программа t == 1 f == 0 практически всегда (ну или другое похожее определение). А без if-а ты такое запаришься компилировать и оптимизировать, в машинке-то у тебя jmp, а не call-ы будут (я надеюсь). if-ы позволяют строить AST, из которого потом можно получать быстрый байткод, а без if-ов ты скорее всего вообще не построишь такой же AST и будет у тебя всё долго и грустно тормозить.

Ну и да, без if-ов просто неудобно было бы писать все эти лямбды на каждый чих. Как сахар он тоже важен.

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

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

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

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

Legioner ★★★★★
()

Кстати интереса ради - покажи реализацию функции «<». Вот у тебя есть t и f, определенные как в твоём посте. Как теперь сделать (define (< a b), чтобы он заработал как ожидается?

Legioner ★★★★★
()

Логика программы находится в голове программиста, а не в тексте программы.

это пока борщ не остыл

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

Как теперь сделать (define (< a b), чтобы он заработал как ожидается?

Давно сделано, в той же unlambda можно наблюдать это. «Как сделать эффективно» — другой вопрос.

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

С нуля писать — это конечно, в однострочник не уместится, но смысл:

(define smaller? (lambda(x y)
   (if (< x y) t f)))

(if_ (smaller? 1 2) (lambda() (write 'Yes)) (lambda() (write 'No))) ; Yes
(if_ (smaller? 2 1) (lambda() (write 'Yes)) (lambda() (write 'No))) ; No
(if_ (smaller? 1 1) (lambda() (write 'Yes)) (lambda() (write 'No))) ; No

anonimous
() автор топика
Ответ на: комментарий от Legioner

Ну да, и кстати, вариант без иф тут выглядит почище, с лингвистической точки зрения:)

((smaller? 1 2) (lambda() (write 'Yes)) (lambda() (write 'No))) ; Yes
((smaller? 2 1) (lambda() (write 'Yes)) (lambda() (write 'No))) ; No
((smaller? 1 1) (lambda() (write 'Yes)) (lambda() (write 'No))) ; No

anonimous
() автор топика
Ответ на: комментарий от emulek

Достаточно всего 8 операторов

Что значит «Достаточно»? Там 8 операторов, а тут — только функция и 2 операции: аппликация и абстракция. Что меньше то?

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

Что значит «Достаточно»? Там 8 операторов, а тут — только функция и 2 операции: аппликация и абстракция. Что меньше то?

вот и покажи мне, как ты этой «одной функцией» реализуешь helloworld. ВНЕЗАПНО тебе ещё понадобиться как минимум одна функция, по типу printf(3) или лучше интерфейс к glibc. Это как борщ: что-бы съесть тарелку борща, по мнению лоровских аналитегов, достаточно одной ложки. Увы. В реальности нужна картошка, свёкла, кастрюля, и много чего другого.

И да, где твоя реализация «меньше», на этой твоей одной функции, и без булей-арфмулей?

Т.ч. «були», это часть математики, а математика — как твоя мама, которая тебе варит борщ. Ты к этому так привык, что считаешь их обоих не нужными.

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

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

У тебя просто отсутствует глубинное понимание сути борща.

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

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

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

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

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

это верно.

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

8 - много. Достаточно одной iota. Или двух S и K.

anonymous
()

Вот поэтому в смолтоке нет специальной конструкции для if, а сообщение ifTrue:ifFalse: с двумя аргументами-блоками (лямбдами) посылается* сразу объекту класса Boolean.

* - на деле, оно обычно инлайнится

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

Т.ч. «були», это часть математики, а математика — как твоя мама, которая тебе варит борщ. Ты к этому так привык, что считаешь их обоих не нужными.

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

anonimous
() автор топика
Ответ на: комментарий от ilammy

offtop

Ты получил письмо на lisp.in.small.pieces@gmail.com?

// С.Л.

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

Получается: борщ — это неотъемлемая часть вычислений? Без него никак?

конечно.

Но мы отклонились от вопроса: «И тут возникает вопрос: а при чем тут вообще логика?». Ответ в том, что сама по себе логика неявна сокрыта в твоих функциях. Дело даже не в том, что невозможно построить вычислитель на одной функции, нет, это возможно. Проблема в другом: ЧТО будет вычислять этот твой вычислитель? И какой ценой? Функции — абстрактный объект, который IRL сам по себе не существует, а вот логика существует, и работает. На ней и реализовано всё, и борщ, и функции.

Какова практическая ценность твоего «открытия»? Какой прок от вычислителя, способного вычислить «что угодно»? Я вижу только один способ использования такого вычислителя: загрузить туда какой-нить алгоритм, и пусть твой вычислитель его улучшает. Попробуй это реализовать, твоя реализация «чего угодно» на одной функции не нужна, т.к. реализация этого на логике у меня _уже_ есть.

Удачи.

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

Ты не понял основную мысль.

Никто не понимает. Наверное потому что она отсутствует.

Понятия истины и лжи относительны, как с философской, так и с практической точки зрения.

Платон с тобой не согласен. Тоже из-за узости мышления?

Читай Платона, а? И свои озарения неси в Talks - станешь там популярной вниманиешлюхой. А CS и математика без тебя переживет как-нибудь.

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

В топике я показал, как задача решаемая с помошью логики, легко решается без явной логики
легко решается без явной логики

А t и f это что?

я показал

Ты ничего не показал.

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

t и f — это просто функции. Это инерция твоего мышления заставляет тебя думать о них как о истине и лжи.

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

Ты не понял основную мысль. Я говорю не о нужности/ненужности, а о избыточности. Нужно уметь отделять необходимое от удобного.

ты в очередной раз пытаешься доказать, что «чем проще, тем лучше». При этом ты даже не вывело строго критерия «проще».

На самом деле, программисты тоже люди, и если человека всё заставить делать только членом, наверное он справится. Вопрос — нужно-ли это? Лично я и далее буду стучать по клаве руками, а ходить ногами.Но ты можешь идти до конца, и отрубить себе всё, кроме члена.

Понятия истины и лжи относительны

неверно. Они аксиоматичны. Т.е. ты можешь постулировать как «истину» всё что угодно, но только один раз. В дальнейшем, если сдвинуть твою «истину», то вся твоя логика рухнет. Логика это не аксиомы, это как раз теоремы, которые следуют из немногих аксиом. Для выражения своих мыслей тебе достаточно всего двух символов: 0 и 1, но ты юзаешь 33 буквы + ещё пару сотен разного(большие буквы, цифры, смайлы, запятые, и кнопку «поместить» на ЛОРе). Почем так?

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

Ты решил задачу при помощи true и false. Не более.

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

то вся твоя логика рухнет.

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

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

Да посмотри уже на SK. Твои «открытия», с каждым разом остаются все на том же уровне.

Всю суть твоего поста можно выразить: «Если були можно определить средствами языка, тогда зачем они нужны как часть языка?».

Kuzy ★★★
()
Последнее исправление: Kuzy (всего исправлений: 1)
Ответ на: комментарий от anonimous

t и f — это просто функции. Это инерция твоего мышления заставляет тебя думать о них как о истине и лжи.

вот то, что ты о них думаешь — субъективно. А сами они объективны.

Т.е. нет никакой разницы, как ты записываешь логику, она от этого другой не станет. Простосмениться представление. Как в C++ ты можешь сделать свой класс чисел, и определить для них «+» как "-", а "-" как «%». Да, можешь. А зачем?

сравни свой код: (t (lambda() (write 'foo)) (lambda() (write 'bar))) ; foo

с моим: x? write("foo"): write("bar");

я обошёлся для if/else всего тремя символами. Разве это не самое простое, что можно придумать?

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

я обошёлся для if/else всего тремя символами. Разве это не самое простое, что можно придумать?

Я не знаю простое это или нет, но это не одно и то же. Потому что я могу написать

(t (lambda() (write 'foo)) (lambda() (write 'bar))) ; bar
Переопределив t, а ты не можешь, ибо используешь оператор зафиксированный на уровне языка и завязанный на логику. Разница в том, что я сам выстраиваю логику, а ты, в данном случае, используешь то, что тебе «дано свыше»

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

Чтобы не рухнула — пиши побольше костылей аксиом. Математики делают именно так.

то, что ты называешь «математикой» действительно базируется на куче аксиом.

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

Завтра или будет дождь или не будет дождя, логично?

нет. Я в Питере живу. У нас там эта операция приводит к undefined behaviour, как деление на ноль.

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

Всю суть твоего поста можно выразить

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

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

Разница в том, что я сам выстраиваю логику, а ты, в данном случае, используешь то, что тебе «дано свыше»

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

А у меня это не баг, а фича, ибо я _всегда_ знаю, как это работает. А тебе придётся перелопатить тонны кода. В этом цель твоего «улучшения»?

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

Я в Питере живу. У нас там эта операция приводит к undefined behaviour, как деление на ноль.

Это выражение всегда вычисляется в истину, хоть ты в Питере, хоть в Коста-Рика.

anonimous
() автор топика
Ответ на: комментарий от emulek

я _всегда_ знаю, как это работает

А я всегда определяю, как это будет работать. Мне не надо ничего знать. Будет работать как я захочу.

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

Никакой логики нет, и ничто на ней не базируется. Логика — это свойство ума, а не программ.

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

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

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

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

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

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

А я всегда определяю, как это будет работать. Мне не надо ничего знать. Будет работать как я захочу.

да-да. С небольшим условием, что ты написал интерпретатор/компилятор, спаял компьютер, накормил борщом металлургов. Т.е. чисто теоретически. Практически, с какого конца не посмотри, ничего этого ты не сделал. Такие дела.

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

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

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

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

нет, ты. Это ты не понимаешь того, что ты понятия не имеешь о самых простых вещах, которые ты делаешь. К примеру: как ты отличаешь кошку от собаки?

То что они вычисляют что-то — это мнение человека о процессах, и это не истина в последней инстанции, объективно ни там ни там никакого вычисления не происходит

как раз объективно и происходит. Простая электронная схема объективно выполняет операцию AND, и это факт. Та же самая схема будет выполнять OR, только надо будет считать 0 как 1 и наоборот. Схема от этого не меняется. Добавив ещё и NOT мы получим всё остальное. При должном соединении вычисления объективно _будут_. А вот что там вычислитель об этом думает? Мы этого просто не знаем. Ясное дело, у NAND на это мозгов не хватит. А у миллиона NAND? Докажи, или опровергни.

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

На целых пяти

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

anonimous
() автор топика
Ответ на: комментарий от emulek

К примеру: как ты отличаешь кошку от собаки?

Благодаря моей способности отличать кошку от собаки. Эту способность можно назвать свойством. Не все обладают этим свойством. К примеру, сливной бачок не отличит.

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

неопределённость == неразрешимость. Вопрос лишь в терминологии. Возьми монетку, какой стороной она упадёт? «Ответ»: UB. С другой стороны, можно её подкинуть и посмотрев, разрешить проблему. Но до этого проблема неразрешима.

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

Простая электронная схема объективно выполняет операцию AND, и это факт

Нет, объективно она что-то там выполняет (или не выполняет) а я тут вижу твою субъективную оценку происходящего.

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

Все время забываю что ты поехавший, извини.

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

неопределённость == неразрешимость

Даже если так, то высказывание вычисляется в истину, оно не имеет к этому отношения.

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

всё остальное можно вывести из этого. Например из аксиом 2 и 4 следует определение инкремента. А из этого инкремента следует сложение. Из сложения автоматически следует вычитание, как обратный оператор. А вычитание приводит нас к тому, что полукольцо натуральных чисел неполно. Сделать систему полной поможет кольцо целых, его не нужно определять, оно само по себе возникает, ибо иначе мы не можем вычислить 3-7 например. Также как мы получили сложение из инкремента, мы получаем умножение, и деление. Множество рациональных чисел помогает сделать математику полной(увы, деление на ноль в принципе запрещает полноту, к счастью всего в одной точке, для бесконечного множество это мелочь). Ну и так далее.

Т.е. не нужно никаких костылей к этим пяти аксиомам, новые числа появляются сами собой, для закрывания дырок-UB в нашей математике. И мы точно знаем, какие нам нужны новые затычки.

Проблема в том, что чем больше дыр закрыто, тем больше появляется новых.

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

оно само по себе возникает, ибо иначе мы не можем вычислить

Вот это характерная для математика подмена понятий. У меня есть молоток, но нет гвоздя. Эврика!!! У меня есть гвоздь, потому что он мне нужен чтобы забить гвоздь в деревяшку, иначе зачем мне молоток? Стоп! а есть ли у меня деревяшка? Об этом мы узнаем в следующей серии (конечно есть, иначе куда я буду забивать гвоздь? Аксиомы, епта)

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