Macro Substitution
Jim Ault
JimAultWins at yahoo.com
Mon Oct 9 21:45:41 EDT 2006
On 10/9/06 1:38 PM, "Robert Sneidar" <bobs at twft.com> wrote:
> Lemme cite an example of Macro Substitution:
>
> put "/sbt/apdata1/apmast" into m0apmast
> put "02" into m0company
>
> now referring to &m0apmast.&m0company. would yield "/sbt/apdata1/
> apmast02"
>
> The ampersand is the Macro Substitution operator in Foxpro.
Try thinking custom properties for a moment
no declarations needed, as opposed to globals
working code just ahead....
function gcp whichcp --getCustProp
--eg. put gcp(m0company) into partVar
on scp whatVal, whichcp --setCustProp
--eg.
scp "02", m0company
scp "/sbt/apdata1/apmast", m0apmast
--one-line version
scp "02", m0company; scp "/sbt/apdata1/apmast", m0apmast
----------------------------start code copy here --------------
on scp whatVal, whichcp
put quote into q
get merge ("set the [[whichcp ]] of this stack to [[q& whatVal &q]]")
do it
save this stack --persistent in the IDE
end scp
function gcp whichcp
get merge("get the [[whichcp ]] of this stack")
do it
return it
end gcp
-----------sample script useage
on operatingScript
scp "/sbt/apdata1/apmast", m0apmast
scp "02", m0company
answer gcp(m0apmast)&gcp(m0company)
end operatingScript
--no globals were maimed in this exercise
-------- end code copy here ---------------------------------------------
> I think I can code around this. It's just that I am finding I am
> going to have to do a lot of recoding to make this port work.
---Try this code-morphing script FP>Rev
Each line of code will have the replacement
&m0company. > gp(m0company)
fld input ---->
&m0apmast.&m0company.
FOR each &m0apmast.&m0company.
SORT &m0apmast.&m0company. AND tbleOne
fld output ---------->
gp(m0apmast)&gp(m0company)
FOR each gp(m0apmast)&gp(m0company)
SORT gp(m0apmast)&gp(m0company) AND tbleOne
on cpTest
put fld input into textBlock
repeat for each line LNN in textBlock
put LNN into codeLine
replace "&" with cr&"&" in codeLine
repeat for each line LNN2 in codeLine
if char 1 of LNN2 is "&" then --morph this macro
get LNN2
replace "." with ")" in it
replace "&" with "gp(" in it
replace cr with empty in it
put it after thisCodeLine
replace ")gp(" with ")&gp(" in thisCodeLine
else
put LNN2 after thisCodeLine
end if
end repeat
put thisCodeLine & cr after newCodeLines
put empty into thisCodeLine
end repeat
put newCodeLines into fld output
end cpTest
Try this form of using a global array
global mA --macro array storage
put "/sbt/apdata1/apmast" into mA[m0apmast]
put "02" into mA[ m0company]
answer mA[m0apmast]&mA[m0company]
-------------------
using custom properties, that don't have to be declared
set the m0apmast of this stack to "/sbt/apdata1/apmast"
set the m0company of this stack to "02"
------------------
If you are thinking of multi-line macro substitution (which would be the
same as a subroutine call with no parameters), which is more than one line
in the Macro, then Rev's equivalent would be a library of handlers or
functions
Hope this gets you a little closer to your goal
Jim Ault
Las Vegas
More information about the use-livecode
mailing list