|
|
1.1 ! root 1: # LMAP ! 2: # ! 3: # Map list ! 4: # ! 5: # Ralph E. Griswold ! 6: # ! 7: # Last modified 12/15/85 ! 8: # ! 9: ! 10: # This procedure is modeled after the built-in string mapping function. ! 11: # The main difference is that the first argument is modified, rather ! 12: # than constructing a new list. This is in the interests of efficiency ! 13: # and likely uses, but is easily changed. ! 14: # ! 15: # Warning: a2 and a3 are cached so that the table of correspondences ! 16: # is not rebuilt if lmap is called successively with the same mapping ! 17: # lists. Just because a2 and a3 are the same does not mean that they ! 18: # have the same values on successive calls of lmap. Thus, the ! 19: # equivalence of maps is taken from the value of a2 and a3, not their ! 20: # respective elements. This is deliberate, but could result in ! 21: # unexpected results. ! 22: ! 23: procedure lmap(a1,a2,a3) ! 24: static lmem2, lmem3, lmaptbl, tdefault ! 25: local i ! 26: initial tdefault := [] ! 27: if not(type(a1) == type(a2) == type(a3) == "list") ! 28: then stop("illegal type in lmap") ! 29: if not(*a2 = *a3) ! 30: then stop("Run-time error:\nSecond and third arguments of lmap differ in length") ! 31: if not(lmem2 === a2 & lmem3 === a3) then { # if an argument is new, rebuild ! 32: lmem2 := a2 # save for future reference ! 33: lmem3 := a3 ! 34: lmaptbl := table(tdefault) # new mapping table ! 35: every i := 1 to *a2 do # build the map ! 36: lmaptbl[a2[i]] := a3[i] ! 37: } ! 38: every i := 1 to *a1 do # map the values ! 39: a1[i] := (tdefault ~=== lmaptbl[a1[i]]) ! 40: return a1 ! 41: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.