Вверх ↑
Этот топик читают: Гость
Ответов: 5446
Рейтинг: 323
#1: 2009-12-07 20:00:38 ЛС | профиль | цитата
Есть предложение сделать несколько мета-функций в FTCG, которые бы генерировали распространённые блоки кода.

Рассмотрим такой FTCG-код:

func doStartsWith(_data)
fvar(s,p,b,e,q)

if (isdef(End) and isndef(Start))
error "Either specify only Start, or both Start and End"
return
end

s = Str
p = Substr
b = (isdef(Start)?(', '+Start):'')
e = (isdef(End)?(', '+End):'')

q = '('+Str+').startswith('+p+b+e+')'

if (linked(Result))
println(res, ' = ', q)
event(onResult, res)
else
event(onResult, q)
end
end

Хотелось бы, чтобы код выглядел примерно так:

func doStartsWith(_data)
q = "$Str.startswith($SubStr{, $Start{, $End}}"
save_and_return(onResult, Result, q)
end


На всякий случай поясняю:
1) Имена, начинающиеся на $, рассматриваются кодогенератором как имена соответствующих свойств (точек). Префикс ($) можно задавать в direct.inc. Возможна и такая форма записи:

q = make_code("$Str.startswith($SubStr{, $Start{, $End}}")

2) в блоке {...} записываются необязательные параметры (символ задаётся в direct.inc). Вложенность накладывает ограничения: нельзя задать End, не задавая Start - об этом должен сообщить CodeGen.

3) Синтаксис save_and_return: save_and_return(event, [var, ] code), где event - имя события, происходящего по завершении функции, var - (необязательное) имя переменной, в которой сохранить результат, code - код (целевого языка), генерирующий результат. Оператор присвоения - в direct.inc

// save_and_return(onSomething, Something, SomeFVar)
if (linked(Something))
print (res, ' = ', SomeFVar)
event(onSomething, res)
else
event(SomeFVar)
end

//...skip...
func Something
return(res)
end

P.S. Я не утверждаю, что этим должен заниматься codegen. Пусть это будет препроцессор.
карма: 1

0
vip
#1.1контекстная реклама от партнеров
Администрация
Ответов: 15294
Рейтинг: 1518
#2: 2009-12-08 10:38:52 ЛС | профиль | цитата
с первой частью не очень понятно -
iarspider писал(а):
Вложенность накладывает ограничения: нельзя задать End, не задавая Start - об этом должен сообщить CodeGen.

у нас же нет такого правила определения параметров. Любое не заданное св-во или точка приравнивается некоторому дефолтному значению...
карма: 26
0
Ответов: 5446
Рейтинг: 323
#3: 2009-12-12 15:36:14 ЛС | профиль | цитата
Dilma, да, ступил. Вложенность нужна для генерации более компактного кода. В данном случае мы выбираем из трёх шаблонов функции:
str.startswith(sub)
str.startswith(sub, start)
str.startswith(sub, start, end)
в зависимости от заданности (не-дефолтности) параметров start и end
карма: 1

0
3
Сообщение
...
Прикрепленные файлы
(файлы не залиты)