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

2) Между прочим - как раз первое реальное применение мной в проекте ML
Edited Date: 2013-03-14 05:48 am (UTC)

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

2. Поиск шаблона 19%02d в тексте - это ML? Что я могу на это сказать, кроме бугога?

Date: 2013-03-14 07:16 am (UTC)
From: [identity profile] kouzdra.livejournal.com
1. FP - это не "парадигма", а набор технических приемов и языковых решений (список опущу) - довольно случайный кстати, хотя народился он в недрах ML не случайно - там оно довольно понятным образом вылазит.

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

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

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

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

2. Ну что товарищи миллиардеры своих клиентов знают лучше и умеют впаривать говно по высшему классу - да - таки потому и миллиардеры. Но таки предлагаю решить задачку (на С она тоже решается - просто подходы там ML-ные - а так - ну больше кодирования просто будет и текст не 200 строчек, а 2000).
Edited Date: 2013-03-14 07:19 am (UTC)

Date: 2013-03-14 08:03 am (UTC)
From: [identity profile] pargentum.livejournal.com
1. Ну да, любой реальный язык - это набор технических приемов и языковых решений. Но тогда в чем величие философии и почему для избежания серости надо изучать именно хаскел, а не форт, регекспы или брэйнфак?

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

2. Признаться, не понимаю задачку. В GCC вся необходимая инфраструктура для поиска строки исходного кода присуствует (внимательно посмотрев на выдачу препроцессора, вы должны заметить директивы #line). GDB, lint, да и сам компилятор замечательно справляются с задачей выдачи номеров этих строк, в том числе в виде, удобоваримом для емакса с эклипсом.

Date: 2013-03-14 08:09 am (UTC)
From: [identity profile] kouzdra.livejournal.com
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 Date: 2013-03-14 08:14 am (UTC)

Date: 2013-03-14 09:29 am (UTC)
From: [identity profile] pargentum.livejournal.com
1. Ваш пример демонстрирует, что замыкание - как и многие другие технические и языковые решения в ФП - это решение для, мягко говоря, надуманной проблемы. Нам не следует ждать трудностей от природы, взять их у нее - наша задача. Это, пожалуй, даже более радикальная точка зрения, чем то, что пытался сказать я.

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

блаблабла

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

Что прикажете подсвечивать?

Date: 2013-03-14 10:42 am (UTC)
From: [identity profile] kouzdra.livejournal.com
1. Ну какая "надуманная проблема" - все у кого мозги еще не испачканы С и тем "что так нельзя" так писать хотят - и более того - это очень полезная фича. Что вы уже подверглись кастрации и эту возможность использовать не умеете - о том собственно и речь.

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

PS: Кстати - я уже отмечал, что аутсорсинг внутри РФ тоже существует - и VB-шная писанина и была зааутсоршена Мише Бульонкову в Академ. По вашим комментариям я кажется начал лучше понимать, почему именно это в Нск и надо было аутсорсить.
Edited Date: 2013-03-14 11:00 am (UTC)

Date: 2013-03-14 11:56 am (UTC)
From: [identity profile] pargentum.livejournal.com
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 Date: 2013-03-14 11:57 am (UTC)

Date: 2013-03-14 12:04 pm (UTC)
From: [identity profile] kouzdra.livejournal.com
1. Смысл тут в том, что результат compose - именно функция - которую можно передать параметром, повесить call-back-ом или что-то еще. Щас - я знаю вы мне расскажете как это все замечательное делается при помощи пары указатель на функцию и указатель на void *. Я в курсе. Это и есть замыкание.

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

При том, что у этой задачки есть очень простое решение.

Date: 2013-03-14 12:30 pm (UTC)
From: [identity profile] pargentum.livejournal.com
1. Ну так и спрашивается, зачем изобретать умные слова и даже целые языки, если то, чего вы хотите, пишется на C в три строчки? И, кстати, зачем в случае конкретно функций sin и cos какой-то еще указатель?

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

Судя по тому, что ваше решение требовало 64Мб ОЗУ и не пошло в эксплуатацию, оно не было простым.
Edited Date: 2013-03-14 12:33 pm (UTC)

Date: 2013-03-14 12:47 pm (UTC)
From: [identity profile] kouzdra.livejournal.com
Да не сделаете - хакеров системы "все уже написано - unix way" я кучи видел. Там собственно один такой cpp 2 месяца ковырял - тоже грил что "усе просто". Только не работало. То тут на байтик съедет, то там эвристика не сработает. Через два месяца всем надоело, что он держит и я за неделю написал. Моей части 64 метра кстати как раз не надо было - оно надо было gcc. А претензия заказчика заключалась в том, что "ах - так это чтобы отчет напечатать начальству надо чтобы еще и через компилятор прошло?"

Date: 2013-03-14 01:00 pm (UTC)
From: [identity profile] pargentum.livejournal.com
Ну, бесплатно я, конечно, делать не буду. Но обратите внимание, что мое решение не предполагает "ковыряния" cpp и каких либо эвристик. Только использование документированной функциональности, уже присутствующей в самом cpp.

Date: 2013-03-14 01:07 pm (UTC)
From: [identity profile] kouzdra.livejournal.com
Я обращаю внимание, что оно не является решением. Простые случаи оно возьмет наверное - только вот реальный С-шный код "простым случаем" не является.

Date: 2013-03-14 01:50 pm (UTC)
From: [identity profile] pargentum.livejournal.com
Я обращаю внимание, что конкретных контрпримеров вы не приводите.

Date: 2013-03-14 02:24 pm (UTC)
From: [identity profile] kouzdra.livejournal.com
Так а смысл приводить конкретные контрпримеры к размахиванию руками? Ну вы еще руками помахаете - "а вот это мы вот таким хаком уделаем". И так до бесконечности (ну или до 2 месяцев как в реале).

Date: 2013-03-14 02:46 pm (UTC)
From: [identity profile] pargentum.livejournal.com
Простите, но писать работающий прототип забесплатно мне почему-то влом.
Мое размахивание руками, во всяком случае, содержит хоть какую-то конкретику, а ваше полностью голословно.

Date: 2013-03-14 02:52 pm (UTC)
From: [identity profile] kouzdra.livejournal.com
Дык ваша "конкретика" - набор ad hoc хаков, непробиваемость коих заключается именно в их неконкретности - вы имеете возможность сказать - а вот я не это имел в виду - а вот совсем другой хак.

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

(no subject)

From: [identity profile] pargentum.livejournal.com - Date: 2013-03-14 02:57 pm (UTC) - Expand

(no subject)

From: [identity profile] kouzdra.livejournal.com - Date: 2013-03-14 03:00 pm (UTC) - Expand

(no subject)

From: [identity profile] pargentum.livejournal.com - Date: 2013-03-14 03:04 pm (UTC) - Expand

(no subject)

From: [identity profile] kouzdra.livejournal.com - Date: 2013-03-14 03:10 pm (UTC) - Expand

(no subject)

From: [identity profile] pargentum.livejournal.com - Date: 2013-03-14 03:43 pm (UTC) - Expand

(no subject)

From: [identity profile] kouzdra.livejournal.com - Date: 2013-03-14 03:08 pm (UTC) - Expand

(no subject)

From: [identity profile] pargentum.livejournal.com - Date: 2013-03-14 03:48 pm (UTC) - Expand

(no subject)

From: [identity profile] kouzdra.livejournal.com - Date: 2013-03-14 05:00 pm (UTC) - Expand

(no subject)

From: [identity profile] pargentum.livejournal.com - Date: 2013-03-15 02:58 am (UTC) - Expand

(no subject)

From: [identity profile] kouzdra.livejournal.com - Date: 2013-03-15 06:11 am (UTC) - Expand

(no subject)

From: [identity profile] pargentum.livejournal.com - Date: 2013-03-15 07:39 am (UTC) - Expand

(no subject)

From: [identity profile] kouzdra.livejournal.com - Date: 2013-03-15 08:06 am (UTC) - Expand

(no subject)

From: [identity profile] pargentum.livejournal.com - Date: 2013-03-15 08:22 am (UTC) - Expand

(no subject)

From: [identity profile] kouzdra.livejournal.com - Date: 2013-03-15 08:59 am (UTC) - Expand

(no subject)

From: [identity profile] pargentum.livejournal.com - Date: 2013-03-15 09:03 am (UTC) - Expand

(no subject)

From: [identity profile] kouzdra.livejournal.com - Date: 2013-03-15 09:07 am (UTC) - Expand

(no subject)

From: [identity profile] pargentum.livejournal.com - Date: 2013-03-15 09:12 am (UTC) - Expand

(no subject)

From: [identity profile] kouzdra.livejournal.com - Date: 2013-03-15 09:17 am (UTC) - Expand

(no subject)

From: [identity profile] pargentum.livejournal.com - Date: 2013-03-15 09:43 am (UTC) - Expand

(no subject)

From: [identity profile] kouzdra.livejournal.com - Date: 2013-03-15 09:52 am (UTC) - Expand

(no subject)

From: [identity profile] pargentum.livejournal.com - Date: 2013-03-15 10:14 am (UTC) - Expand

(no subject)

From: [identity profile] kouzdra.livejournal.com - Date: 2013-03-15 10:46 am (UTC) - Expand

(no subject)

From: [identity profile] pargentum.livejournal.com - Date: 2013-03-15 10:51 am (UTC) - Expand

(no subject)

From: [identity profile] kouzdra.livejournal.com - Date: 2013-03-15 11:03 am (UTC) - Expand

(no subject)

From: [identity profile] pargentum.livejournal.com - Date: 2013-03-18 05:35 am (UTC) - Expand

(no subject)

From: [identity profile] kouzdra.livejournal.com - Date: 2013-03-15 08:21 am (UTC) - Expand

Date: 2013-03-14 12:50 pm (UTC)
From: [identity profile] kouzdra.livejournal.com
PS: Вы мне вот объясните например как вы сами-то свою же подъебку с разбитым на части паттерном собираетесь решать? Не то чтобы это было очень надо - но раз уж сами ее придумали - так - и флаг вам в руки.

Date: 2013-03-14 12:56 pm (UTC)
From: [identity profile] pargentum.livejournal.com
http://pargentum.livejournal.com/1329226.html?thread=7277386#t7277386 , предпоследний абзац. Все, что требуется - это сделать нерекурсивное раскрытие макросов и на каждом этапе смотреть, когда появляется искомый паттерн.

Точнее, чуть подумав, я понял, что надо не лексический анализатор писать, а сразу преобразовывать #define в s-выражение sed.

Date: 2013-03-14 01:03 pm (UTC)
From: [identity profile] kouzdra.livejournal.com
Ну появился он - и что делать-то будете?

а сразу преобразовывать #define в s-выражение sed.

А это как? Напомню кстати, что там довольно непростая семантика. И есть всякое интересно типа
#include M(x)

Date: 2013-03-14 01:47 pm (UTC)
From: [identity profile] pargentum.livejournal.com
Поскольку я раскрываю макросы по одному, то макрос, после которого паттерн появляется, и есть искомый макрос.

>а сразу преобразовывать #define в s-выражение sed.
А это как?
Оплатите два часа работы из расчета $20 в час - напишу. 100% предоплата, разумеется.

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

Поскольку обрабатывается не исходный текст, а выдача препроцессора, все #include там уже раскрыты.
Edited Date: 2013-03-14 02:09 pm (UTC)

Date: 2013-03-14 02:22 pm (UTC)
From: [identity profile] kouzdra.livejournal.com
? Вполне вероятно, что паттерн появился после какого-то define, по итогам коего заинклудился нужный файл (в коем оно просто текстуально было всегда).

В принципе, идею, как это делается, легко почерпнуть из практически любых регекспов для синтаксического подчеркивания языка C, например для vim

Дык оно там никак толком не делается - сами можете посмотреть.

Date: 2013-03-14 02:35 pm (UTC)
From: [identity profile] pargentum.livejournal.com
Я еще раз повторяю: поскольку директивы #define ищутся не в исходном файле, а в выдаче cpp -dU, то описываемой вами проблемы возникнуть не может. Все #include и #ifdef там уже обработаны.

А что бестолкового в синтаксическом подчеркивании vim? У препроцессора, на самом деле, синтаксис очень простой.

Date: 2013-03-14 02:43 pm (UTC)
From: [identity profile] kouzdra.livejournal.com
Ну так - у вас есть макра #define xxx(z) 19#z

И что вы с ней будете делать?

(no subject)

From: [identity profile] pargentum.livejournal.com - Date: 2013-03-14 02:52 pm (UTC) - Expand

Date: 2013-03-14 06:59 am (UTC)
From: [identity profile] trurle.livejournal.com
Гы-гы-гы

Profile

pargentum: (Default)
pargentum

January 2026

S M T W T F S
     1 2 3
4 5 6 78910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 8th, 2026 01:07 am
Powered by Dreamwidth Studios