тогда вы в runtime вынуждены будете включить компилятор
--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 15:49
Если потребуется менять код совсем извне, руками программиста - то да. Но не вижу, что в этом плохого, т.к. Ваш вариант этого вообще не позволяет (или я неправ?)
Если менять код не извне, а изнутри, то компилятор нам не понадобится. Как можно вставить одну функцию в код другой, если заранее известен код первой, места, откуда взять ее параметры, место, куда положить возвращаемое ей значение, и место, куда именно вставлять кусок кода? Да ведь очень просто, или я неправ?
--------------------------------------------------------------------------------
ZeNoN <2 Андрей Finder Плахов> 10 января, 15:54
Вставить код? Какой именно код?
Ведь код заранее известен, верно?
--------------------------------------------------------------------------------
Иван FXS
ZeNoN <2 Иван > 10 января, 15:26
... возможность свести одно к другому еще не означает равенство по таким параметрам как быстрота разработки и быстродействие.
" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "
Ок, снова приходим к тому, что программирование - это ДЕЯТЕЛЬНОСТЬ.
Эффективность среды, средств, технологии программирования (тех же языков) могут оцениваться (и даже - просто обсуждаться) только в ДЕЯТЕЛЬНОСТНОЙ парадигме. И - с учетом КОНКРЕТНЫХ решаемых ЗАДАЧ!
Вот у Вас - есть задача, которая РЕАЛЬНО требует всего того, что мы здесь обсуждаем?
У меня - есть!
НП, Иван FXS
--------------------------------------------------------------------------------
ZeNoN 10 января, 15:57
2 Андрей Finder Плахов
> в том числе сгенерированном at runtime <
вот это замечание я не понял
2 Иван FXS
# - операция препроцессора. Возвращает имя фактического параметра макроса в кавычках. Например:
#define printvar(var) printf(#var " = %d ", var)
...
x = 1; y = 2; z = 3;
printvar(x);
printvar(y);
printvar(z);
printvar(4);
...
вывод:
x = 1
y = 2
z = 3
4 = 4
--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 15:58
>Какой именно код?
>Ведь код заранее известен, верно?
Неет! Код мог, в свою очередь, быть получен такими же преобразованиями над другими функциями. Поскольку преобразования могут выполняться динамически в зависимости от условных выражений, заранее мы не можем знать о его виде ничего, кроме принимаемых и возвращаемых типов.
--------------------------------------------------------------------------------
ZeNoN <2 Иван FXS> 10 января, 16:00
> Ок, снова приходим к тому, что программирование - это ДЕЯТЕЛЬНОСТЬ... <
Я ваш набор слов не понимаю. Попробуйте уточнить понятия, произносимые с таким пафосом. Помните, что они столь значимы только для вас лично.
--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 16:04
> > в том числе сгенерированном at runtime <
> вот это замечание я не понял
Результат любой операции над функциями - это и есть новый сгенерированный код байт-машины. Например, что такое код для функции С = А+В, где А и В - функции c одним возвращаемым значением? Это примерно вот что:
...Pushargs
А
...Pushargs
B
OP_PLUS
Т.е. код для С может быть получен at runtime, если знать коды А, В и информацию о типах, ими принимаемых и возвращаемых.
--------------------------------------------------------------------------------
ZeNoN <2 Андрей Finder Плахов> 10 января, 16:05
С этим я согласен. Просто динамически получаемый код образуется из кирпичиков - скомпилированных кусков кода. И вот эти самые куски уже известны заранее.
Далее, обратите внимание на то, что все операции над функциями это - в конечном счете - операции над константами.
Там нет переменных, поскольку нет дополнительных данных, получаемых
на runtime от пользователя или из его файлов. Следовательно, компилятор может выявить подмножество блоков, которые могут в принципе попасть на данный участок. Возможно стоит как-то облегчить ему эту работу?
--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 16:14
так эти самые uses и changes и облегчают до невозможно легкого, вот так:
int func_name( arg1, arg2, .. )
{
mutable(name = code) uses u1, u2... changes c1, c2...
}
Тогда в функторе Insert( func_name, code, func2 ) на месте func2 могут стоять только вот такие функции:
(с1, с2...) func2( arg1, arg2, ..., u1, u2,...);
и причем какие угодно из таких.
--------------------------------------------------------------------------------
Иван FXS
ZeNoN <2 Иван FXS > 10 января, 16:00
> ... произносимые с таким пафосом.
дыыыык, этааааааа ... как же можно: идеологемы - и без пафоса? ;-)
> Я ваш набор слов не понимаю.
> Попробуйте уточнить понятия ...
А зачем? Мне достаточно того, что моя ПОЗИЦИЯ продекларирована предельно четко.
И все ключевые слова (=понятия):
деятельность, задача, среда, средства, технология, ... , оценка, парадигма
- представлены.
НП, Иван FXS
--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 16:21
Лучше, кстати, мутабельные части даже так писать, так совсем понятно, что происходит:
int func_name( int arg1, float arg2, .. )
{
int u1, c1;
float u2, c2;
...
c1, c2 = mutable Code( arg1, arg2, u1, u2 );
}
после чего можно так:
(int,float) func2( int, float, int, float );
func_name = Insert( func_name, Code, func2 );
а еще можно и так:
func_name = Insert( func_name, Code, { return arg1 + u1, arg2 + u2 } );
--------------------------------------------------------------------------------
ZeNoN <2 Андрей Finder Плахов> 10 января, 16:36
о! последний вариант хорош! :)
--------------------------------------------------------------------------------
ZeNoN <2 Иван FXS> 10 января, 16:38
> Мне достаточно того, что моя ПОЗИЦИЯ продекларирована предельно четко. <
Свалены в кучу нечеткие понятия вроде "деятельность " и "деятельностный " и получилось предельно четко? Забавное понимание четкости...
--------------------------------------------------------------------------------
Иван FXS
Деятельность - нечеткое понятие???
Интересно ... а "Вселенная " - четкое?
Или, например, "человек " ...
;-)
--------------------------------------------------------------------------------
ZeNoN <2 Иван FXS> 10 января, 17:08
А ты попробуй определи это понятие.
Что есть деятельность?
Что значит "оцениваться в деятельностной парадигме "?
--------------------------------------------------------------------------------
Иван FXS
Раз пошла такая пьянка, - режь последний огурец: а что значит "попробуй ", "определи " и "понятие "?
:-(
Вы вообще такое слово "парадигма " - знаете?
:-((
--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 18:07
2ZeNoN, 2 Иван FXS
Шшш, не "кидайте понты "! Вы оба умные :)) Просто слегка не понимаете друг друга.
Иван, я правильно понял, что ты имел в виду "а для какой практической цели вам нужно все это "? И считаешь, что полная рефлексия полезнее, т.к. ты ее уже используешь в практич. целях?
--------------------------------------------------------------------------------
ZeNoN 10 января, 18:21
Вот я и ехидничаю по поводу
"как оценивается в деятельностной парадигме? "
вместо
"зачем? "
2 Иван
Например, функция qsort для универсальности использует вызов функции. Передача параметров и обращение к стеку занимают намного больше времени, чем сравнение. Если бы была возможность заменить код сравнения непосредственно перед сортировкой это бы значительно ускорило алгоритм.
--------------------------------------------------------------------------------
NO <контакт> 10 января, 18:50
F# is a mixed functional/imperative programming language based on the design of the functional language Caml and the .NET language C#.
http://research.microsoft.com/projects/ilx/fsharp.htm
--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 19:32
2NO
Ну, если придираться, то там в FAQ есть, в частности, вопрос "Why don't you implement functors? "
А вообще, это что-то очень похожее. Но мне еще ближе что-то вроде Caml, который там называется предком F#. Единственное сомнение - насколько быстро это может работать?
И еще, если вы обратили внимание, я веду речь не просто о языке, основанном на функциях как базовом понятии, а о языке, в котором были возможны операции динамического определения функций. В Caml я нашел только статическое определение. Я ошибаюсь, или действительно нельзя написать, скажем, хотя бы так:
if (y) then
let somefunc (x) = x
else
let somefunc (x) = 2*x
;;
Я-то именно так хочу.
--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 19:34
Хотя такими языками, как F#, все равно очень здорово писать, скажем, парсеры. Я так и представляю... Парсер в 20 строках - супер!
--------------------------------------------------------------------------------
Иван FXS
2 ZeNoN
Вы считаете, что моя мысль была бы более понятна, если бы я написал:
Эффективность среды, средств, технологии программирования (тех же языков) могут оцениваться (и даже - просто обсуждаться) только ... ЗАЧЕМ?
;-))))))))
НП, Иван FXS
--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 20:13
Иван FXS
Не понял ваш последний пост. А что если я точно так же спрошу:
Удобство дебага, наличие в той или иной среде развернутой информации о коде во время его исполнения, мощь средств трекинга значений, может оцениваться (и даже - просто обсуждаться) только ... ЗАЧЕМ?
--------------------------------------------------------------------------------
smollett 10 января, 20:34
2Андрей Finder Плахов
>if (y) then
let somefunc (x) = x
else
let somefunc (x) = 2*x
;;
Я-то именно так хочу.
Так а чем не устраивает eval() подход в таком случае?
--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 20:51
smollett
eval-подход - это, как бы, "эмуляция " предлагаемого подхода.
Во-первых, eval просто медленный и всегда будет таким, т.к. должен парсить текст функции. Во-вторых eval работает с параметрами-строками. Проблема в том, что в самОй строке никак не написано, где и как ее можно поменять, и что бы это изменение значило.
У нас "функция " будет определяться не только кодом, подлежащим выполнению, как в других языках, но и разметкой этого кода - указанием того, какие его куски можно поменять, и на что, а какие нельзя, куда можно что-то вставить дополнительно и какими-то "hint'ами " относительно того, как изменения могли бы повлиять на работу функции.
Главное здесь - понять, что слово "функция " значит совсем не то же самое, что в С. В Caml и F#, например, функцией называют некое рекурсивное описание, пользуясь которым, можно сгенерировать код, "применяющий " эту функцию к величинам заданных типов.
Это во многом превосходит наш подход, т.к. у нас типы, с которыми работает функция, жестко заданы (или у нас и от этого можно избавиться, а я просто пока не вижу, как?). Но и уступает тоже во многом, т.к. в Caml и F# описание функции "статично " и генерируется еще при компиляции.
--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 20:58
Хм, я вдруг понял, что и "шаблонное " задание функций у нас вполне возможно.
Просто операции будут вестись над instantiated функциями, а не над шаблонами.
--------------------------------------------------------------------------------
smollett 10 января, 20:59
2Андрей Finder Плахов
>if (y) then
let somefunc (x) = x
else
let somefunc (x) = 2*x
;;
Я-то именно так хочу.
part 2:
Совсем мозги жиром блин заплыли, а указатели на функции нафига придуманы:
int (*a)(int);
Но вообще помоему эта конструкция ниче ценного в себе не несет как Вы к ней пришли? упустил, сорри
--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 21:11
>а указатели на функции нафига придуманы
Ну! Указатели на функции - это другой способ эмуляции %))
Ну так, с ходу, вот что можно отметить против:
1) По-моему, досадное упущение, но факт остается фактом: нет в С-подобных языках функций, возвращающих более одного значения. Очень, кстати, часто напрягает.
2) Вызов функции по указателю всегда медленнее встроенного вызова.
3) Самое ужасное. Если mutable - это просто вызов функции по указателю, то как передать по такому указателю не обычную функцию, а такую, которая сама уже мутировала? Ответ такой: на самом деле, придется передавать не указатель на функцию, а "дерево указателей ". Но это уже довольно громоздкая конструкция.
Вот такие соображения показывают, что синтаксис С-подобных языков не очень хорошо подходит для выражения нашего подхода и путем введения указателей на функцию.
--------------------------------------------------------------------------------
smollett 10 января, 21:14
>У нас "функция " будет определяться не только кодом, подлежащим выполнению, как в других языках, но и разметкой этого кода
А у нас ф-я будет элементарным элементом кода который можно менять
>Проблема в том, что в самОй строке никак не написано, где и как ее можно
поменять
В связи с тем что у нас ф-я элементарный юнит, то менять его не надо его надо подменять, О, а как подменять зачем и когда это выясняется в ран тайм.
Так что вы того, меня не путайте.
>eval просто медленный и всегда будет таким
усе у нас в мире относительно, я лично никуда не спешу, и к решению частных проблем не склонен приналичии нерешенных общих
--------------------------------------------------------------------------------
DrDrew <Из Жизни Замечательных Е Б Н -энов> 10 января, 21:14
1) По-моему, досадное упущение, но факт остается фактом: нет в С-подобных языках функций, возвращающих более одного значения. Очень, кстати, часто
Vozvrashai Spisok ili array, esli bolshe nravitsia
--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 21:18
>помоему эта конструкция ниче ценного в
>себе не несет как Вы к ней пришли?
Почитайте наши с ZeNoN'ом дискуссии по поводу того, какой синтаксис должен быть, и что он означает. Главное, что нам нужно - это умение менять функции во время выполнения. Если в языке нельзя написать даже такую простейшую конструкцию, как эта, то он не настоящий "функциональный язык ".
В С можно, но чуть более сложную - уже туго, вот, например, такое как реализовать указателями на функции?
if (y) then
let somefunc (x) = x
else
let somefunc (x) = 2*x
;
if (z) then
let somefunc2 (x) = x*x
else
let somefunc2 (x) = x+1
;
let finalfunc (x) = somefunc(x) + somefunc2(x);;
(пишу опять на псевдо-F#, никакого отношения к нашим с ЗеНоНом упражнениям такой синтаксис не имеет)
--------------------------------------------------------------------------------
smollett 10 января, 21:22
>Вот такие соображения показывают, что синтаксис С-подобных языков не очень хорошо подходит для выражения нашего подхода и путем введения указателей на функцию.
А я про че см. выше:
>Но вообще помоему эта конструкция ниче ценного в себе не несет как Вы к ней пришли?
Не нужно на мой взгляд мыслить в терминах языка, реши че хочешь добится потом найди хоть 1 метод осуществления а потом уже в свободное время занимайся оптимизацией. Нам ф-ии нужно было динамически менять? Для чего? Ежели нашли способ надо делать шаг вперед предполагая что мы умеем это делать.
--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 21:23
DrDrew
>Vozvrashai Spisok ili array, esli bolshe nravitsia
:))
Разговор-то о синтаксисе и о выражаемых языком идеях. Ну не предназначен С возвращать две вещи. Если приходится вернуть две, начинается "а давайте создадим одну вещь, в которой будут лежать те две и вернем ее ".
Я хочу простую и понятную запись такого: положить в стек первое значение; положить второе; выйти из функции; вытащить из стека второе, присвоить; вытащить первое, присвоить.
А мне предлагают: создать объект из указателей на данные и следующий, выделять память под два таких, устанавливать указатели, возвращать этот объект, потом эти указатели вынимать оттуда, потом память освобождать... Ужас.
--------------------------------------------------------------------------------
smollett 10 января, 21:25
2Андрей Finder Плахов
как реализовать указателями на функции?
if (y) then
let somefunc (x) = x
else
let somefunc (x) = 2*x
;
if (z) then
let somefunc2 (x) = x*x
else
let somefunc2 (x) = x+1
;
let finalfunc (x) = somefunc(x) + somefunc2(x);;
Вы правда не знаите или прикалываетесь?
--------------------------------------------------------------------------------
smollett 10 января, 21:27
DrDrew
>Vozvrashai Spisok ili array, esli bolshe nravitsia
Почему я не вижу этого мсджа?
А еще можна по ссылке параметер передавать :)
--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 21:29
>Нам ф-ии нужно было динамически менять?
>Для чего? Ежели нашли способ надо делать
>шаг вперед предполагая что мы умеем это
>делать
Разумно, но если договориться, как именно мы будем это делать, то неясностей будет меньше, не так ли? Пока мы с ZeNoN'ом не поговорили насчет реализации синтаксиса, мы представляли себе мутирующие функции совсем по-разному. Теперь, кажется, нам они представляются одинаково.
А тебе, как мне кажется, пока по-другому. Из-за этого тема дин. изм. ф. могла бы у нас быстро заглохнуть, как заглохли "определения ИИ ". Не стоит спешить.
--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 21:33
smollett
>Вы правда не знаите или прикалываетесь?
Гррр, опять я был не понят. Как видите, в этом примере finalfunc, если ее описывать при помощи указателей, станет уже не одним указателем на функцию, а двумя. Если продолжать пример, и ее "условным образом " поюзать в какой-нибудь другой "lastfunc ", то lastfunc уже придется описывать деревом указателей.
--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 21:35
smollett,
Я тут ошибся и назвал Вас на ты. Может, превратим это из ошибки в традицию? Я был бы рад общаться с Вами "на ты ".
--------------------------------------------------------------------------------
Андрей Finder Плахов 10 января, 21:45
Есть здесь кто-нибудь живой?..
Эх, комбинатора, Егорова и Коломейко мы уже распугали... Может, обратно позовем? Обсудим пока что-то другое, пусть динамические функции в голове укладываются пока?
Например, есть еще желающие дать определение интеллекта?
--------------------------------------------------------------------------------
NO <контакт> 10 января, 22:33
Андрей Finder Плахов:
Oberon (Алгол-Паскаль-Модула-Оберон) умеет возвращать структуры, и выглядит это скорее всего точно так как ты писал о стеке.
Велосипедизм обсуждаемого вопроса в том что в мутируемой функции мы все равно должны сами заранее предусмотреть мутации. А вот если я, допустим, захотел отмутировать qsort чтобы она сортировала не список, а дву-мерную таблицу. Или нужно не сортировать все, а только найти сумму наибольших 100 элементов.
--------------------------------------------------------------------------------
smollett 10 января, 22:39
2Андрей
ежели
somefunc(x) + somefunc2(x)=2*x+(x+1)
То вводится оператор сложения который работает с указателями на фии и усе.
>Может, обратно позовем? Обсудим пока что-то другое, пусть динамические функции в голове укладываются пока?
если ты обратил внимание то кол-во постингов относительно дин ф-й в 10 раз больше чем по другой теме на форуме.
Но позвать не плохобы только чем их приманишь?
--------------------------------------------------------------------------------
smollett 10 января, 22:47
>NO
>Велосипедизм обсуждаемого вопроса в том что в мутируемой функции мы все равно должны сами заранее предусмотреть мутации
В самую точку!
Предлагаю случайную генерацию мутаций с заранее заданым критерием отбора результатом. ась?
Но это велсипед все используют а тут к чему пришли - кино не возможно?
--------------------------------------------------------------------------------
NO <контакт> 11 января, 00:37
smollett:
случайную ждать слишком долго, нужен какой-то движок который быстро вывернет все так чтобы можно было просто дописать.
--------------------------------------------------------------------------------
smollett 11 января, 00:47
2NO <контакт >
Помните "Джентельменов удачи "? Там дерево такое..... :)
Я так мыслю что ежели запустить, при этом основное внимание уделив критерию отбора, то ничго дописывать окромя как в критерий не придется. А критерий можно менять со стороны динамически.
--------------------------------------------------------------------------------
smollett 11 января, 06:29
Тааааак, кажись из американской диаспоры на форуме тока я остался, даже Др. признаков жизни не подает :) обидно слушай и поговорить нескем :((
--------------------------------------------------------------------------------
ZveroBoy (DrDr) <как канибал - канибалу> 11 января, 06:40
так ты сознаешься - что в бога мы веруем... или как
вот зашел... весь в крови... переодеться в белые одежды не успел... Андрей утром будет недовольный... наследил я тут вам... да вот у нас горя - вэб-журналиста убили за актиа\вную работу на веб-сайте... забили дубинками... ровесник Плахова
--------------------------------------------------------------------------------
smollett 11 января, 07:04
Сознаюсь веруете :)
По моим данным оч изрядный был программер а убили его не за активную работу на веб-сайте, а за 1200$
--------------------------------------------------------------------------------
ZveroBoy DrDr <как канибал - канибалу> 11 января, 07:43
1200 -это стоимость заказа, а заказывают всегда за что-то, видимо ваша Бостон-глоб плохо перевела с русского...
--------------------------------------------------------------------------------
smollett
2DrDr
Игра слов, на самом деле :)
Те кто заплатил то они готовы были отдать 1200$ чтоб .... но другие за
1200$ убили (стоимость контракта см. новый завет глава про 30 серебряников)
Так что убили за 1200$ и заказали тоже за 1200$ все деньги - цена жизни - цена
И - все в уях.
Комментариев нет:
Отправить комментарий