| Новости | FAQ | Авторы | Документация | В действии | Библиотека |
| Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
Sumo 25.02 09:19 / 25.02 09:19
... и подключать точно зная имена. И мне не надо возиться с рефлексией и одноимёнными классами — явно указываю что и откуда взять на простейшем миниязыке: path/to/package.p@className::constructor.# use.p:
#!./parser3
@main[]
$t1[^getClass[./use_package.p@Test1]]
^t1.method[]
$t2[^getClass[./use_package.p@Test2::init;$.var[12345]]]
^t2.method[]
@getClass[aClassDef;aOptions] -> [object]
$lClassDef[^pfString:parseClassDef[$aClassDef]]
^if(def $lClassDef.package){
^use[$lClassDef.package]
}
$result[^reflection:create[$lClassDef.className;^if(def $lClassDef.constructor){$lClassDef.constructor}{create};$aOptions]]
@CLASS
pfString
@OPTIONS
locals
static
@auto[]
$self.__pfString__[
$.classDefRegex[^regex::create[^^([^^@:]*)(?:@([^^:]+))?(?::+(.+))?^$]]
]
@parseClassDef[aClassDef] -> [$.className $.constructor $.package $.classDef]
## Формат aClassDef: path/to/package.p@className::constructor
$aClassDef[^aClassDef.trim[]]
$result[$.classDef[$aClassDef]]
^aClassDef.match[$self.__pfString__.classDefRegex][]{
$result.constructor[^if(def $match.3){$match.3}{create}]
^if(def $match.2){
$result.className[$match.2]
}{
$result.className[^file:justname[$match.1]]
}
$result.package[^if($match.1 ne $result.className){$match.1}]
}
#------------
# use_package.p:
@CLASS
Test1
@create[aOptions]
@method[]
method1
@CLASS
Test2
@init[aOptions]
$self.var[$aOptions.var]
@method[]
method2 $self.var