?

Log in

No account? Create an account

Отец понять его не мог и земли отдавал в залог - Argentum — ЖЖ

мар. 14, 2013

12:45 pm - Отец понять его не мог и земли отдавал в залог

Previous Entry Поделиться Пожаловаться Next Entry

В двух почти  соседних постах, Куздра
1) Возмущается серостью практикующих ООП и не понимающих величия философии мраксизма ФП
2) Рассказывает, каким программированием и на чем он зарабатывает деньги на жизнь.

КДПВ:
про хаскель и джаву

Comments:

[User Picture]
From:kouzdra
Date:Март 14, 2013 05:47 am
(Link)
1) Я как раз оговорил, что речь не о FP (FP-то щас во все щели тянут - даже в С++ замыкания с лямбдами вон вставили - скоро Авва начнет восхищаться - благо станет модно), а о общей серости Аввы и прочих адептов. Что не "не нравятся другие подходы, а он их просто не знает".

2) Между прочим - как раз первое реальное применение мной в проекте ML

Edited at 2013-03-14 05:48 (UTC)
(Ответить) (Thread)
[User Picture]
From:pargentum
Date:Март 14, 2013 06:31 am
(Link)
1. ФП, как я понимаю - это программирование без использования разрушающего присваивания, с рекурсией вместо циклов. Лямбда операторы в C# - это просто безымянные функции, а никакое не ФП. Замыкания же... если глобальные переменные - это зло, то что можно сказать о замыканиях?

2. Поиск шаблона 19%02d в тексте - это ML? Что я могу на это сказать, кроме бугога?
(Ответить) (Parent) (Thread)
[User Picture]
From:kouzdra
Date:Март 14, 2013 07:16 am
(Link)
1. FP - это не "парадигма", а набор технических приемов и языковых решений (список опущу) - довольно случайный кстати, хотя народился он в недрах ML не случайно - там оно довольно понятным образом вылазит.

Лямбда операторы в C# - это просто безымянные функции, а никакое не ФП.

Я вообще-то грил про С++ (и это не опечатка). Вполне себе FP - базовая конструкция FP, в частности - high-order functions. Собственно если уж на то пошло, то FP - в первую очередь лямбды и замыкания.

Замыкания же... если глобальные переменные - это зло, то что можно сказать о замыканиях?

Глобальные переменные зло (умеренное) когда они переменные. С++ кстати явно разделяет "замыкание-по-копированию" и "замыкание-по-ссылке"

2. Ну что товарищи миллиардеры своих клиентов знают лучше и умеют впаривать говно по высшему классу - да - таки потому и миллиардеры. Но таки предлагаю решить задачку (на С она тоже решается - просто подходы там ML-ные - а так - ну больше кодирования просто будет и текст не 200 строчек, а 2000).


Edited at 2013-03-14 07:19 (UTC)
(Ответить) (Parent) (Thread)
[User Picture]
From:pargentum
Date:Март 14, 2013 08:03 am
(Link)
1. Ну да, любой реальный язык - это набор технических приемов и языковых решений. Но тогда в чем величие философии и почему для избежания серости надо изучать именно хаскел, а не форт, регекспы или брэйнфак?

Если контекст замыкания - не переменные, то в чем вообще сакральный смысл замыкания и чем оно отличается от дополнительных (скрытых) параметров?

2. Признаться, не понимаю задачку. В GCC вся необходимая инфраструктура для поиска строки исходного кода присуствует (внимательно посмотрев на выдачу препроцессора, вы должны заметить директивы #line). GDB, lint, да и сам компилятор замечательно справляются с задачей выдачи номеров этих строк, в том числе в виде, удобоваримом для емакса с эклипсом.
(Ответить) (Parent) (Thread)
[User Picture]
From:kouzdra
Date:Март 14, 2013 08:09 am
(Link)
1. Сакральный смысл замыкания в том, что без него скажем функция

proc compose = ((real) real f, (real) real g) (real) real:
(real x) real: f (g (x))

при попытке написать что-то вроде compose (sin, cos) (3.1415)

вывалится с segfault.

На то еще все первокурсники умные у нас на курсе налетали - когда им про A-68 начинали рассказывать.

2. Ну задача простая - подсветить не "строчку", а именно скажем 19%02 - с точностью до символа - более того - если он упрятан в макрос - сделать это в месте определения макроса, а не его вызова (а если он передан макросу в качестве параметра - то все-таки в месте вызова макроса - ну то есть там где он на самом деле)

Edited at 2013-03-14 08:14 (UTC)
(Ответить) (Parent) (Thread)
[User Picture]
From:pargentum
Date:Март 14, 2013 09:29 am
(Link)
1. Ваш пример демонстрирует, что замыкание - как и многие другие технические и языковые решения в ФП - это решение для, мягко говоря, надуманной проблемы. Нам не следует ждать трудностей от природы, взять их у нее - наша задача. Это, пожалуй, даже более радикальная точка зрения, чем то, что пытался сказать я.

2. А если код выглядит так:
#define YEAR "19"

блаблабла

printf("блаблабла"YEAR"%02" блаблабла);

Что прикажете подсвечивать?
(Ответить) (Parent) (Thread)
[User Picture]
From:kouzdra
Date:Март 14, 2013 10:42 am
(Link)
1. Ну какая "надуманная проблема" - все у кого мозги еще не испачканы С и тем "что так нельзя" так писать хотят - и более того - это очень полезная фича. Что вы уже подверглись кастрации и эту возможность использовать не умеете - о том собственно и речь.

2. И то и то конечно - я кстати это и делал.

PS: Кстати - я уже отмечал, что аутсорсинг внутри РФ тоже существует - и VB-шная писанина и была зааутсоршена Мише Бульонкову в Академ. По вашим комментариям я кажется начал лучше понимать, почему именно это в Нск и надо было аутсорсить.

Edited at 2013-03-14 11:00 (UTC)
(Ответить) (Parent) (Thread)
[User Picture]
From:pargentum
Date:Март 14, 2013 11:56 am
(Link)
1. В C можно написать ваш пример без всяких замыканий:
#include <math.h>
#include <stdio.h>

double compose(double (*f)(double), double (*g)(double), double x) {
        return f(g(x));
}

int main() {
        printf("%g\n", compose(sin, cos, M_PI));
}

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

2. Берем, значит, исходник. Напускаем на него cpp -dU, запоминаем вывод в файле, назовем его dU (он, возможно, будет использован несколько раз) Делаем контекстный поиск паттерна по содержимому файла dU (исключая #define). Если паттерн нашелся, по директиве #line восстанавливаем файл, где он нашелся, смотрим соответствующую строку исходника. Если там такой паттерн тоже есть, задача решена. Если паттерна нету, это результат раскрытия макроса. Запускаем cpp -dM, конкатенируем вывод со строкой из исходника, обрабатываем полученное cpp -dU, сохраняем результат в файле dU1 (этот файл также может потребоваться нам несколько раз). Таким образом, получаем список всех макросов, раскрываемых при обработке проблемной строки. Ищем паттерн по определениям макросов. Если находим, то задача опять-таки решена, остается только найти соответствующую строку исходника по директивам #line в файле dU.

Наконец, самый сложный случай, когда искомый паттерн собирается препроцессором по кускам из нескольких разных макросов. Вот тут надо написать простенький лексический анализатор (можно на регекспах), который делает в исходной строке подстановку первого уровня макросов из файла dU1. Если в результате паттерн образовался, задача решена. Если нет, делаем подстановку второго уровня и так далее. Поскольку файл dU1 короткий, количество проходов по нему мало что решает.

В общем, если не беспокоиться о количестве запусков препроцессора, задача решается шелловским скриптом с использованием GCC cpp и grep/sed за пару часов. Опять-таки, поскольку вся ресурсоемкая работа делается внутри cpp, то код верхнего уровня можно писать именно на шелле. Или сразу на скриптовом языке интегрированной среды разработки, в которой вы будете делать подсвечивание.


Edited at 2013-03-14 11:57 (UTC)
(Ответить) (Parent) (Thread)
[User Picture]
From:kouzdra
Date:Март 14, 2013 12:04 pm
(Link)
1. Смысл тут в том, что результат compose - именно функция - которую можно передать параметром, повесить call-back-ом или что-то еще. Щас - я знаю вы мне расскажете как это все замечательное делается при помощи пары указатель на функцию и указатель на void *. Я в курсе. Это и есть замыкание.

2. Не сделаете ни за пару часов, ни за пару недель (то есть сделаете - но глючить будет перманентно). Я тут знаете плавал - вы не первый такой умный.

При том, что у этой задачки есть очень простое решение.
(Ответить) (Parent) (Thread)
[User Picture]
From:pargentum
Date:Март 14, 2013 12:30 pm
(Link)
1. Ну так и спрашивается, зачем изобретать умные слова и даже целые языки, если то, чего вы хотите, пишется на C в три строчки? И, кстати, зачем в случае конкретно функций sin и cos какой-то еще указатель?

2. Чего именно не сделаю? cpp -dU не запущу? Или не смогу преобразовать #define в регексп, точнее в s-выражение для sed?

Судя по тому, что ваше решение требовало 64Мб ОЗУ и не пошло в эксплуатацию, оно не было простым.

Edited at 2013-03-14 12:33 (UTC)
(Ответить) (Parent) (Thread)
[User Picture]
From:kouzdra
Date:Март 14, 2013 12:47 pm
(Link)
Да не сделаете - хакеров системы "все уже написано - unix way" я кучи видел. Там собственно один такой cpp 2 месяца ковырял - тоже грил что "усе просто". Только не работало. То тут на байтик съедет, то там эвристика не сработает. Через два месяца всем надоело, что он держит и я за неделю написал. Моей части 64 метра кстати как раз не надо было - оно надо было gcc. А претензия заказчика заключалась в том, что "ах - так это чтобы отчет напечатать начальству надо чтобы еще и через компилятор прошло?"
(Ответить) (Parent) (Thread)
[User Picture]
From:pargentum
Date:Март 14, 2013 01:00 pm
(Link)
Ну, бесплатно я, конечно, делать не буду. Но обратите внимание, что мое решение не предполагает "ковыряния" cpp и каких либо эвристик. Только использование документированной функциональности, уже присутствующей в самом cpp.
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]
From:kouzdra
Date:Март 14, 2013 12:50 pm
(Link)
PS: Вы мне вот объясните например как вы сами-то свою же подъебку с разбитым на части паттерном собираетесь решать? Не то чтобы это было очень надо - но раз уж сами ее придумали - так - и флаг вам в руки.
(Ответить) (Parent) (Thread)
[User Picture]
From:pargentum
Date:Март 14, 2013 12:56 pm
(Link)
http://pargentum.livejournal.com/1329226.html?thread=7277386#t7277386 , предпоследний абзац. Все, что требуется - это сделать нерекурсивное раскрытие макросов и на каждом этапе смотреть, когда появляется искомый паттерн.

Точнее, чуть подумав, я понял, что надо не лексический анализатор писать, а сразу преобразовывать #define в s-выражение sed.
(Ответить) (Parent) (Thread) (Развернуть)
[User Picture]
From:trurle
Date:Март 14, 2013 06:59 am
(Link)
Гы-гы-гы
(Ответить) (Thread)