Использовать процедурный тип при объявлении процедуры\функци

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

olegy123 писал(а):Вот бы с паскалем так..


Свят, свят, свят... и так уже слишком много паскалей для одного компилятора. ($MODE FPC, $MODE TP, $MODE OBJFPC,$MODE DELPHI...)
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>и так уже слишком много паскалей для одного компилятора
Дак это от отсутствия стандартов))
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

А если вы используете чужой парсер тогда понятно почему +100500 определений команд нужно..
Не проще самому написать парсер? тогда команды можно разбирать на что, куда, кому и как.. вместо их вариаций
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Парсер чего. я непонимаю? вот пример моей команды:

Код: Выделить всё

function DrawLine_com(operands:TCommandOperands):TCommandResult;
var
    pline:PGDBObjLine;
    p1,p2:gdbvertex;
begin
    if commandmanager.get3dpoint('Specify first point:',p1) then//просим первую точку
    if commandmanager.get3dpoint('Specify second point:',p2) then//просим вторую точку
    begin
      pline := AllocEnt(GDBLineID);//выделяем память
      pline^.init(nil,nil,0,p1,p2);//инициализируем

      zcSetEntPropFromCurrentDrawingProp(pline);//присваиваем текущие слой, вес и т.п
      zcAddEntToCurrentDrawingWithUndo(pline);//добавляем в чертеж
    end;
    result:=cmd_ok;
end;

ее регистрация в программе

Код: Выделить всё

CreateCommandFastObjectPlugin(@DrawLine_com,'DrawLine',CADWG,0);

после ввода в командную строчку 'DrawLine' или активации экшена с этой командой - будет запущена соответствующая процедура. Это простейший случай
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

zub писал(а):Зачем при объявлении 100500 функций надо писать полную декларацию? Потом приспичивает добавить например arg2 и приходится 100500 раз копипастить.
какнибудь так было бы гораздо логичней:

Проблема не в паскале.. проблема в решении задачи..
Логичнее определить команду и потом уже определить аргумент(массив аргументов). Тогда не нужно копипастить функционал под каждый аргумент..
[Команда] [аргумент],[аргумент]..

Добавлено спустя 9 минут 9 секунд:
Re: Использовать процедурный тип при объявлении процедуры\функци
что мешает в функцию отправлять массив аргументов, и там определять количество их
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Чето вас нетуда понесло. Похоже вы путаете мои "команды" и скрипты.
>>Проблема не в паскале.. проблема в решении задачи..
Что я куда не передавал, проблема не в этом. Проблема в том что нельзя (без костылей) централизовано определить множество одинаковых функций
zub писал(а):всё получается. но много копипасты + в режиме delphi нет контроля аргументов = можно прокопипастится
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

Лекс Айрин писал(а):Дак это от отсутствия стандартов))


в С и иже с ними стандарты есть... а толку?
Паскалей же сейчас (актуальных) две с полтиной программы, не считая версий.
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

zub писал(а):Похоже вы путаете мои "команды" и скрипты.

команды же скриптовые..

я как понял при
zub писал(а):function command1(arg1:TMyArg):TMyCommandResult;

function command1(arg1:TMyArg;arg2:TMyArg):TMyCommandResult;
нужно переопределять эту же функцию command1 заново..

zub писал(а): Проблема в том что нельзя (без костылей) централизовано определить множество одинаковых функций

ну для этого существуют макросы.

Добавлено спустя 7 минут 1 секунду:
Re: Использовать процедурный тип при объявлении процедуры\функци
Я про то что можно переделать так:
zub писал(а):var
com:TMyCommand;
..
com:=GetNeededCommand;
res:=com(arg1:TMyArg)


в

Код: Выделить всё

type TMyArgArray = array of TMyArg;
TMyCommand=function(arg1:TMyArgArray):TMyCommandResult
..
com:=GetNeededCommand;
res:=com(arg1:TMyArgArray);
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>команды же скриптовые..
их можно комбинировать, есть некоторые средства взаимодействия, но до полноценных скриптов далеко. Скрипты будут отдельно.

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

>>Я про то что можно переделать так:
это усложняет содержимое команд. и добавляет кучу проблем с синтаксисом в рантайме
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

zub писал(а):это усложняет содержимое команд. и добавляет кучу проблем с синтаксисом в рантайме

если вы хотите гибкость в скриптах, то должны учитывать их в анализе команд. Иначе вы и +100500 команд в реале напишете.. при необходимых <50

Я сам пишу прослойку в Lua. Там в функцию аргументы в виде стека передаются, тот же самый массив.

Добавлено спустя 8 минут 38 секунд:
Re: Использовать процедурный тип при объявлении процедурыфункци
У самого руки чешутся написать jit компилятор, который бы выдавал jit asm код.

Добавлено спустя 2 минуты 49 секунд:
Re: Использовать процедурный тип при объявлении процедуры\функци
zub писал(а):уж незнаю почему, но макросы и инклуды - отношу к костылям

Мне приходится использовать один и тот же код для ARM и x86_64
там никак без макросов..
это сишники используют макросы не к месту, и потом смотришь пол дня что за size_t, какой тип имеют виду uint32_t или uint64_t.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>Я сам пишу прослойку в Lua. Там в функцию аргументы в виде стека передаются, тот же самый массив.
У меня тоже для связи есть стек. например если перед вышеприведенной командой запустить команду которая после себя оставит в стеке координаты точки, то первый get3dpoint незаметно для ползователя извлекет их оттуда, и пользователю останется указать только вторую координату.
Но это ничего не меняет
olegy123
долгожитель
Сообщения: 1643
Зарегистрирован: 25.02.2016 11:10:20

Сообщение olegy123 »

На сколько понял zcad скриптовый.. и вы щас пытаетесь перенести все в командую строку? Это так?
Аватара пользователя
serbod
постоялец
Сообщения: 449
Зарегистрирован: 16.09.2016 10:03:02
Откуда: Минск
Контактная информация:

Сообщение serbod »

Код: Выделить всё

case ACommand of
  cmd1: Result := 1+1;
  cmd2: Result := 2*2;
  cmdN: Result := 100500 div 100500;
end;
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>и вы щас пытаетесь перенести все в командую строку? Это так?
Нет. всё изначально было так сделано. Это не проблема что что то не получается реализовать. просто хочется фичи.

serbod
Не))
ElectroGuard
новенький
Сообщения: 71
Зарегистрирован: 03.06.2016 11:10:22

Сообщение ElectroGuard »

скриптовые интерпретаторы нужно какие-то искать. возможно есть что-то готовое
Ответить