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