runFile
package metaobjectTest | |
@doc{* | |
This metaobject works like action_afti_dsa but the | |
Myan code is read from the file that is the first parameter. So, instead | |
of putting the Myan code attached to the annotation, it is read from | |
the file, which may be preceded by a package name. The file should have | |
extension myan and be in the –-data directory of the package. Usage example: | |
@runFile_afti_dsa("runFile_afti_dsa.afti_dsa_test", | |
"with:1 do:1", "unary", 10) | |
The Myan file can have parameters in its name. They are textually | |
replaced by the parameters of the annotation (but the first, that is | |
the file name). Then, in this example, there should be a file | |
afti_dsa_test(MetSig,UMS,Ret).myan | |
in directory metaobjectTest\--data. Inside the file, strings Ret, | |
the third formal parameter, are replaced by 10. The same with the | |
other parameters. | |
The methods of the Myan file can declare methods of the following | |
interfaces: | |
IAction_dpa | |
IAction_dsa | |
IActionNewPrototypes_dsa | |
IAction_afti | |
IActionNewPrototypes_afti | |
ICommunicateInPrototype_afti_dsa_afsa | |
*} | |
object RunFile | |
func run { | |
var Int nowExist = 0; | |
var String currentProgramUnitName = ""; | |
/* | |
Run file --data/afti_dsa_test(MetSig,UMS,Ret).myan | |
of the directory of package metaobjectTest. | |
This file will: | |
- add the code | |
fp = "c"; | |
before the first statement of method "with:1 do:1" | |
- add the code | |
unaryReturn = 10; | |
before the first statement of method 'unary' | |
- add to the current prototype the method | |
func succ: Int n -> Int = n + 1; | |
- add the code after the annotation: | |
nowExist = 5; | |
currentProgramUnitName = "RunFile"; | |
*/ | |
@runFile("afti_dsa_test", "with:1 do:1", "unary", 10) | |
// runFile add 'c' before 'a' and then the | |
// anonymous function adds 'b' before "ca" | |
assert with: "a" do: { (: String s :) | |
^ "b" ++ s | |
} == "bca"; | |
// unary was changed by 'runFile': unaryReturn is set to 10 | |
assert unary == 10; | |
// method succ: was introduced by 'runFile' | |
assert succ: 1 == 2; | |
// nowExist was set to 5 by code generated by 'runFile' | |
assert nowExist == 5; | |
// currentProgramUnitName was set to RunFile by 'runFile' | |
assert currentProgramUnitName == "RunFile"; | |
//printexpr currentProgramUnitName; | |
} | |
func with: String s do: Function<String, String> f -> String { | |
fp = fp ++ s; | |
return f eval: fp; | |
} | |
func unary -> Int { | |
return unaryReturn; | |
} | |
var String fp = ""; | |
var Int unaryReturn = 0; | |
end | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment