Skip to content

add defaults to function definitions #20

Description

@timm
# vim: nospell filetype=awk ts=2 sw=2 sts=2  et :
BEGIN{
  demo("function  Aa(self ,c,d=1  ,e=\"tuesday\", aa= Anads, f, g  ) { # as")
  demo("function  aa(self) ")
  demo("function  Aa(self) ")
  demo("function  aa() { ")
  demo("function  Aa() ")
  demo("function  Aa(i,a=1,c=2) ")
  demo("function  aa(i,a=\"am do\",d=List, c=2) ")
}
function demo(s) {
  print("")
  print("in:\t["s"]")
  prep(s)
  print("fun:\t["PrepFun"]")
  print("s:\t["Preps"]")
}
function prep(s,   a,n,kw) {     # main function
  Preps = PrepFun = ""
	split(prepParts(s), a, ":::")   # main parts of the line
  n = prepKeywords(a[2], ks, vs) # get argumenet key values in ks vs
  PrepFun= prepMain(n,ks,vs,a[1],a[3],ks[1],a[1]~/^[A-Z]/)
}
function prepMain(n,       # number of args on command line
                  ks,vs,   # key,value for args. vs[i] empty if no default
                  f,       # function name
                  end,     # anything on the line after the args
                  self,    # first arguemnt to function
                  methodp, # true if function starts with uppercase
                  j,k,v,raw ){ # local vars
  for(j=1;j<=n;j++) {
    k = ks[j]
    v = vs[j]
    if (raw) {raw=raw","k} else {raw=k}
    if (v) {
      if (v ~ /^[A-Z]/) 
        Preps = Preps "has("self",\""k"\",\""v"\");"
      else
        Preps = Preps (methodp ? (self".") : "") \
               k"=("k"==\"\"?"v":"k"));" }}
  return "function " f "(" raw end
}

function prepParts(s,  pre,fun,end) {
  pre  = "^[ \t]*function[ \t]*"
  fun  = "[A-Za-z0-9_]+"
  end  = "{)#"
  return gensub(pre"("fun")\\(([^"end"]*)(["end"])",  
                "\\1:::\\2:::\\3","g",s)
}
function prepKeywords(s,ks,vs,  a,n,j,tmp) {
  # split arguments on ",", then split each arg on "="
  n = split(s,a,"[ \t]*,[\t ]*")
  for(j=1;j<=n;j++) {
    split(a[j], tmp, /[ \t]*=[ \t]*/)
    ks[j] = tmp[1]
    vs[j] = tmp[2] }
  return n
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions