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

1) Возмущается серостью практикующих ООП и не понимающих величия философии
2) Рассказывает, каким программированием и на чем он зарабатывает деньги на жизнь.
КДПВ:
no subject
Date: 2013-03-14 05:47 am (UTC)2) Между прочим - как раз первое реальное применение мной в проекте ML
no subject
Date: 2013-03-14 06:31 am (UTC)2. Поиск шаблона 19%02d в тексте - это ML? Что я могу на это сказать, кроме бугога?
no subject
Date: 2013-03-14 07:16 am (UTC)Лямбда операторы в C# - это просто безымянные функции, а никакое не ФП.
Я вообще-то грил про С++ (и это не опечатка). Вполне себе FP - базовая конструкция FP, в частности - high-order functions. Собственно если уж на то пошло, то FP - в первую очередь лямбды и замыкания.
Замыкания же... если глобальные переменные - это зло, то что можно сказать о замыканиях?
Глобальные переменные зло (умеренное) когда они переменные. С++ кстати явно разделяет "замыкание-по-копированию" и "замыкание-по-ссылке"
2. Ну что товарищи миллиардеры своих клиентов знают лучше и умеют впаривать говно по высшему классу - да - таки потому и миллиардеры. Но таки предлагаю решить задачку (на С она тоже решается - просто подходы там ML-ные - а так - ну больше кодирования просто будет и текст не 200 строчек, а 2000).
no subject
Date: 2013-03-14 08:03 am (UTC)Если контекст замыкания - не переменные, то в чем вообще сакральный смысл замыкания и чем оно отличается от дополнительных (скрытых) параметров?
2. Признаться, не понимаю задачку. В GCC вся необходимая инфраструктура для поиска строки исходного кода присуствует (внимательно посмотрев на выдачу препроцессора, вы должны заметить директивы #line). GDB, lint, да и сам компилятор замечательно справляются с задачей выдачи номеров этих строк, в том числе в виде, удобоваримом для емакса с эклипсом.
no subject
Date: 2013-03-14 08:09 am (UTC)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 - с точностью до символа - более того - если он упрятан в макрос - сделать это в месте определения макроса, а не его вызова (а если он передан макросу в качестве параметра - то все-таки в месте вызова макроса - ну то есть там где он на самом деле)
no subject
Date: 2013-03-14 09:29 am (UTC)2. А если код выглядит так:
#define YEAR "19"
блаблабла
printf("блаблабла"YEAR"%02" блаблабла);
Что прикажете подсвечивать?
no subject
Date: 2013-03-14 10:42 am (UTC)2. И то и то конечно - я кстати это и делал.
PS: Кстати - я уже отмечал, что аутсорсинг внутри РФ тоже существует - и VB-шная писанина и была зааутсоршена Мише Бульонкову в Академ. По вашим комментариям я кажется начал лучше понимать, почему именно это в Нск и надо было аутсорсить.
no subject
Date: 2013-03-14 11:56 am (UTC)#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, то код верхнего уровня можно писать именно на шелле. Или сразу на скриптовом языке интегрированной среды разработки, в которой вы будете делать подсвечивание.
no subject
Date: 2013-03-14 12:04 pm (UTC)2. Не сделаете ни за пару часов, ни за пару недель (то есть сделаете - но глючить будет перманентно). Я тут знаете плавал - вы не первый такой умный.
При том, что у этой задачки есть очень простое решение.
no subject
Date: 2013-03-14 12:30 pm (UTC)2. Чего именно не сделаю? cpp -dU не запущу? Или не смогу преобразовать #define в регексп, точнее в s-выражение для sed?
Судя по тому, что ваше решение требовало 64Мб ОЗУ и не пошло в эксплуатацию, оно не было простым.
no subject
Date: 2013-03-14 12:47 pm (UTC)no subject
Date: 2013-03-14 01:00 pm (UTC)no subject
Date: 2013-03-14 01:07 pm (UTC)no subject
Date: 2013-03-14 01:50 pm (UTC)no subject
Date: 2013-03-14 02:24 pm (UTC)no subject
Date: 2013-03-14 02:46 pm (UTC)Мое размахивание руками, во всяком случае, содержит хоть какую-то конкретику, а ваше полностью голословно.
no subject
Date: 2013-03-14 02:52 pm (UTC)Но пока у вас даже с конкретикой плохо. Как ваш же пример вы собираетесь поднимать я лично так и не понял.
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2013-03-14 12:50 pm (UTC)no subject
Date: 2013-03-14 12:56 pm (UTC)Точнее, чуть подумав, я понял, что надо не лексический анализатор писать, а сразу преобразовывать #define в s-выражение sed.
no subject
Date: 2013-03-14 01:03 pm (UTC)а сразу преобразовывать #define в s-выражение sed.
А это как? Напомню кстати, что там довольно непростая семантика. И есть всякое интересно типа
#include M(x)
no subject
Date: 2013-03-14 01:47 pm (UTC)Оплатите два часа работы из расчета $20 в час - напишу. 100% предоплата, разумеется.
В принципе, идею, как это делается, легко почерпнуть из практически любых регекспов для синтаксического подчеркивания языка C, например для vim. Смотрите как определяются идентификатор, выражение и вызов функции - и дальше вспоминаете, как sed делает параметрическую замену.
Поскольку обрабатывается не исходный текст, а выдача препроцессора, все #include там уже раскрыты.
no subject
Date: 2013-03-14 02:22 pm (UTC)В принципе, идею, как это делается, легко почерпнуть из практически любых регекспов для синтаксического подчеркивания языка C, например для vim
Дык оно там никак толком не делается - сами можете посмотреть.
no subject
Date: 2013-03-14 02:35 pm (UTC)А что бестолкового в синтаксическом подчеркивании vim? У препроцессора, на самом деле, синтаксис очень простой.
no subject
Date: 2013-03-14 02:43 pm (UTC)И что вы с ней будете делать?
(no subject)
From:no subject
Date: 2013-03-14 06:59 am (UTC)