home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.cs.arizona.edu
/
ftp.cs.arizona.edu.tar
/
ftp.cs.arizona.edu
/
icon
/
historic
/
v941.tgz
/
icon.v941src.tar
/
icon.v941src
/
ipl
/
packs
/
skeem
/
skfun.icn
< prev
next >
Wrap
Text File
|
2000-07-29
|
4KB
|
115 lines
############################################################################
#
# Name: skfun.icn
#
# Title: Scheme in Icon
#
# Author: Bob Alexander
#
# Date: March 23, 1995
#
# Description: see skeem.icn
#
############################################################################
#
# skeem -- Scheme in Icon
#
#
# Function/syntax list format
#
# Each function and syntax defined appears in a definition list which is
# processed at skeem-initialization time. The following are the rules
# for function/syntax list entries:
#
# - Each entry begins with a procedure name and ends just preceding
# the next procedure name or the end of the list.
# - Rules regarding number of arguments:
# - If an entry contains the object "oneOrMore", then it requires
# at least one argument.
# - If an entry contains the object "twoOrMore", then it requires
# at least two arguments.
# - If an entry contains one number N, it requires exactly N
# arguements.
# - If an entry contains a number N followed by &null, the function
# requires at least N arguments.
# - If an entry contains a number N followed by a number M, the
# function requires at least N arguments but can take no more than
# M arguments.
# - If an entry contains no numbers but contains &null, the function
# can take any number of arguments.
# - If an entry contains no numbers and no &null, the procedure
# requires exactly one argument.
# - If an entry contains a string, then that string is used as the
# function's skeem-name rather that the name calculated from its
# Icon procedure name.
#
procedure InitFunctions()
every (
InitBasic | # basic syntaxes skbasic.icn
InitControl | # control functions skcontrl.icn
InitIO | # I/O functions skio.icn
InitList | # list & vector functions sklist.icn
InitMisc | # misc functions skmisc.icn
InitNumber | # number functions sknumber.icn
InitString | # string and char functions skstring.icn
\!InitUser())() # user-defined functions skuser.icn
end
procedure DefFunction(prcList,funType)
local item,funName,prc,minArgs,maxArgs,gotNull,special
/funType := Function
prc := get(prcList)
while \prc do {
funName := minArgs := maxArgs := gotNull := special := &null
repeat {
(item := get(prcList)) | {
item := &null
break
}
if type(item) == "procedure" then break
if type(item) == "integer" then /minArgs | maxArgs := item
else if /item then gotNull := "true"
else if type(item) == "string" then
(if item == ("oneOrMore" | "twoOrMore") then special
else funName) := item
}
if special === "oneOrMore" then minArgs := 1
else if special === "twoOrMore" then minArgs := 2
else if /minArgs then
if \gotNull then minArgs := 0
else minArgs := maxArgs := 1
else if /gotNull then
/maxArgs := minArgs
/funName := ProcName(prc)
#write("+++ ",funName,": ",image(prc),", ",image(minArgs),", ",
# image(maxArgs))
DefVar(funName,funType(prc,funName,minArgs,maxArgs))
prc := item
}
return
end
procedure DefSyntax(prc)
return DefFunction(prc,Syntax)
end
procedure ProcName(prc)
local nm
image(prc) ? {
tab(find(" ") + 1)
nm := ""
while nm ||:= tab(find("_")) do {
move(1)
nm ||:= if ="BANG" & pos(0) then "!"
else if ="2_" then "->"
else if ="P" & pos(0) then "?"
else "-"
}
nm ||:= tab(0)
}
return nm
end