[comp.lang.icon] &null

goer@SOPHIST.UCHICAGO.EDU (Richard Goerwitz) (09/11/89)

It is often extremely useful to test whether a variable has the
type &null, in much the same way as one might perform boolean
operations in other context with other languages.  Recently a
poster complained that variables of type &null could not be con-
verted into other types automatically.  Personally, I cannot see
using Icon without &null.  For instance, if a procedure that is
supposed to assign a value to a variable fails, that variable will
retain its previous value.  In many cases, that value is null, and
a simple slash can test whether this is the case or not.

Rarely does the lack of any &null -> other types conversions com-
plicate a program much.  In the program submitted by the above-
mentioned poster, it amounts to one extra line (comments are mine):

procedure main()
	words:=table()
	line_no:=0
	while line:=read() do {
		line_no +:=1
		write(left(line_no,6),left(line,40))
		line:=map(line)
		i:=1
		while j:=upto(&lcase,line,i) do {
		i:=many(&lcase,line,j)
		if *line[i:j] >= 3
                     #
                     #
		then {if   \words[line[i:j]]       #line 14
	              then insert(words[line[i:j]],line_no)    #line 15
		      else {words[line[i:j]]:=set()    #line 16
		            insert(words[line[i:j]], line_no)   #line 17 
			  }
                     # Try instead:
                     #
                     # /words[line[i:j]] := set()
                     # insert(words[line[i:j]],line_no)
                     }
		}
        }

  	words:=sort(words)
	i:=0
	while pair:=words[i +:=1] do  {
	   writes(left(pair[1],10),":")
	   s:=!pair[2]
	   pair[2]:=delete(pair[2],!pair[2])
           every s ||:= ", " ||!pair[2]
	   write(s)
	   }
	end


I might point out that those i:j subscripting operations above are
all much more elegantly handled by string scanning operations, such
as:

    while substr := tab(many(&lcase)) do {
      tab(upto(&lcase))
      *substr > 3 | next
      etc.


Oh, and don't forget about sort(x,3)!

                                        -Richard L. Goerwitz
                                        goer@sophist.uchicago.edu
                                        rutgers!oddjob!gide!sophist!goer