[My image] hypertalk Thu Jan 19 15:11:24 PST 2012

Contents


    HyperTalk Handbook

      Introduction

      HyperTalk is an unusual language that manages to be as verbose as COBOL and as much fun as BASIC to write. It is part of the HyperCard application development tool that was available free on Apple Macintoshes. It is one Bill Akinson's most enduring legacies (other than MacPaint!).

      Hypercard is object based. There are about a dozen predefined classes like cards, buttons, stacks, and so on. However there is no limit to the behaviors that one can attach to an object in these classes by writing a script for the object. Thus the static structure is predefined but the behaviorial structure is fully dynamic: You can create a button that when clicked assembles a new button with a specialized set of methods attached to it.

      Colouris and Thimbleby [CoulourisThimbleby93] have an excellent book that shows you how to program in hypercard...

      The Wikipedia page [ HyperCard ] needs work but is worth a visit.

      Slashdot [ why-was-hypercard-killed?utm_source=newsletter&utm_medium=email#commentlisting ] discussed Hypertalk and Hypcard at the end of 2011. Here are some resources


        [ ?p=568 ] [ hypercard-gone-for-good ] [ wherefore-art-thou-hypercard ] [ hypercard-what-could-have-been ] [ trying-to-save-hypercard-for-mac-os-x ] [ aboutTheArtist.html ]

      The description below is bottom up starting with the infrastructure (Basis) and then the basic data types(DATA), the predefined Classes, and then the scripting language HyperTalk.

      Basis

        Meta

        The basic definitions etc needed to define HyperTalk.

      1. Basic_types::=\/{ char, class, objects, Types, SANE_Numbers, Times, Nat0, ...}
      2. syntax::=@#lexeme.
      3. lexeme::@#char

        Notation for completing a partial map f by adding a new element:

      4. For Types T1,T2, f:T1<>->T2, x:T2, f|+>x::= (f) | (dom(f)~pre(f))->x.
      5. (above)|-pre(f|+>x )=pre( f |(dom(f)~pre(f))+>x)=pre(f)|(dom(f)~pre(f)) = dom(f)
      6. (above)|-f|+>x in T1->T2.


      7. |-classes.objects.states==>Types, the states of all objects (of all classes) are Types.

        Basis for semantics is they idea that a symbol, of a known type has a meaning:

      8. SYMBOL::=Net{ representation:#lexeme, type:Types, meaning:type}.
      9. |-symbols in @SYMBOL. valid:@::=(representation, type) is_id symbols.
      10. |-For x:#lexeme, T:classes, m:T, symbol(x, T, m) iff (representation=>x, type=>T, meaning=>m) in symbols.
      11. CR::=ASCII.CR.

      12. lexeme::=... .
      13. cons::numeric><numeric---point.
      14. |-cons;(1st, 2nd)=Id.
      15. consr::numeric^4---rectangle.

        Also see the STANDARD assmptions and conventions. In several places I avoid writing a very long and unreadable union (A|B|C|D|E|F|...) by using "| following," and a listed Set. This is a more readable format but means the same thing.

        Classes

        Uses Objects, Meta.

      16. classes::finite_set(CLASS).
      17. |-classes = { menu, window, painting, stack, card, filed, button, numeric, date, menuItem, boolean, point, loc, chunk, script, global }.
      18. CLASS::=
        Net{
        1. states::Sets.
        2. objects::finite_set(OBJECTS).
        3. id is_id objects.
        4. constant::syntax,
        5. global_property::syntax.
        6. property::class->syntax,
        7. function::#class->syntax.
        8. operator::class><class->syntax.

        }=::CLASS.

      19. menu::classes,
      20. window::classes,
      21. painting::classes,
      22. stack::classes,
      23. background::classes,
      24. card::classes,
      25. field::classes,
      26. button::classes,
      27. numeric::classes,
      28. date::classes,
      29. menuItem::classes,
      30. boolean::classes,
      31. point::classes,
      32. loc::classes,
      33. chunk::classes,
      34. script::classes,
      35. global::classes.

      36. scripted_classes::@classes={c:classes || "script" in img(c.property)}.
      37. (above)|-scripted_classes="script"./property={stack, card, background, field, button}.
      38. any_property::syntax=|[c1,c2:class](property(c1)(c2)),
      39. any_global_property::syntax=|[c:class](global_property(c)).
      40. has_property::classes->(classes->syntax),
      41. |-for t1,t2:class, t1.(t2.has_property) = (t2).(t1.property).
      42. |-one global.objects.
      43. hypercard::=the global.objects.
      44. |-for all c:class, x:c.objects(x.class=c).
      45. (above)|-c.objects.class={c}.

        Objects

        Uses Classes.

      46. OBJECT::=
        Net{
        1. id::numeric.constant.
        2. class::classes.
        3. state::class.states. ...

        }=::OBJECT.

      . . . . . . . . . ( end of section Basis) <<Contents | End>>

      Data Types

        Numbers

        Uses Classes.

      1. numeric::classes=the CLASS (
        1. constant=>number, states=>SANE_Numbers,
        2. operator=>(
        3. (numeric,numeric)+>{"+","-","*","/","mod","div"} | (numeric)+>{"-"} |+>{}
        4. ), ...
        ).
      2. SANE_Numbers::=...,
      3. number::=...
          Functions giving numeric
        • "seconds" of ()
        • "secs" of ()
        • "ticks" of ()
        • "mouseH" of ()
        • "mouseV" of ()
        • "clickH" of ()
        • "clickV" of ()
        • "length" of string
        • "charToNum" of string
        • "offset" of (string, string)
        • "random" of ()
        • "version" of ()
        • "windows" of ()
        • "diskSpace" of ()
        • "heapSpace" of ()
        • "stackSpace" of ()
        • "paramCount" of ()
        • "abs" of numeric
        • "annuity" of (numeric, numeric)
        • "atan" of (numeric, numeric)
        • "average" of #numeric
        • "compound" of (numeric, numeric)
        • "cos" of numeric
        • "exp" of numeric
        • "exp1" of numeric
        • "exp2" of numeric
        • "ln" of numeric
        • "ln1" of numeric
        • "max" of #numeric
        • "min" of #numeric
        • "round" of numeric
        • "sin" of numeric
        • "sqrt" of numeric
        • "tan" of numeric
        • "trunc" of numeric

          Properties giving numeric

        • "cursor" of global
        • "dragSpeed" of global
        • "printTextHeight" of global
        • "printTextSize" of global
        • "scriptTextSize" of global
        • "userLevel" of global
        • "buttonCount" of window
        • "hBarLoc" of window
        • "height" of window
        • "hilitedButton" of window
        • "left" of window
        • "right" of window
        • "scale" of window
        • "scroll" of window
        • "top" of window
        • "topLeft" of window
        • "vBarLoc" of window
        • "width" of window
        • "brush" of painting
        • "lineSize" of painting
        • "multiSpace" of painting
        • "pattern" of painting
        • "polySides" of painting
        • "textSize" of painting
        • "id" of background
        • "number" of background
        • "id" of card
        • "number" of card
        • "bottom" of field
        • "height" of field
        • "id" of field
        • "left" of field
        • "number" of field
        • "textHeight" of field
        • "textSize" of field
        • "top" of field
        • "width" of field
        • "bottom" of button
        • "bottomRight" of button
        • "height" of button
        • "icon" of button
        • "id" of button
        • "left" of button
        • "number" of button
        • "right" of button
        • "textHeight" of button
        • "textSize" of button
        • "top" of button
        • "width" of button

        Strings

        Uses Classes.

      4. string::classes=the CLASS (
        1. constant=>{"formfeed", "linefeed", "quote", "return", "space", "tab"},
        2. states=>#char,
        3. operator=>((string,string)+>{"&", "&&"}) | ((chunk)+>{""}),...
        ).

        Functions that give Strings

        • "mouse" of ()
        • "clickLine" of ()
        • "selectedLine" of ()
        • "foundLine" of ()
        • "numToChar" of numeric
        • "sound" of ()
        • "tool" of ()
        • "result" of ()
        • "param" of ()
        • "params" of ()

        Properties giving string

        • "debugger" of global
        • "language" of global
        • "messageWatcher" of global
        • "numberFormat" of global
        • "scriptEditor" of global
        • "StacksInUse" of global
        • "variableWatcher" of global
        • "menuMessage" of menu
        • "menuMsg" of menu
        • "name" of menu
        • "commands" of window
        • "properties" of window
        • "zoom" of window
        • "name" of stack
        • "name" of background
        • "name" of card
        • "name" of card
        • "name" of field
        • "style" of field
        • "textFont" of field
        • "textStyle" of field
        • "name" of button
        • "style" of button

        Texts

        -- a text is string of characters with the same fonts, styles, etc. Uses Strings.

      5. text::=$ Net{chars:#char, TEXT}.

      6. TEXT::=
        Net{
        1. fonts::finite & syntax.
        2. sizes::Nat.
        3. heights::Nat.
        4. style::text_styles

        }=::TEXT.

      7. text_styles::="bold" | "italic" | "underline" | "outline" | "shadow" | "condense" | "extend" | "plain".

      8. alignments::syntax="left"|"right"|"center".

        Booleans

        Uses Classes.

      9. boolean::=the CLASS(constant=>{"true", "false"}, states=>@,
      10. operator=>
      11. ( boolean+>{"not"}
      12. | class+>("there is"( "a" | "no" |"not a"))
      13. | (boolean,boolean)+>{"and", "or"}
      14. | (class,class)+>{"=", "is", "is not", "<>"}
      15. | (string,string)+>{"contains"}
      16. | (point,rectangle)+>{"within"}
      17. | ({string, numeric}><{string, numeric})+>{"<", "<=",">=","<"} |+>{}
      18. ), ... )

        Functions returning Boolean

        • "commandKey" of ()
        • "optionKey" of ()
        • "shiftKey" of ()
        • "mouseClick" of ()

        Properties that are Boolean

        • "blindTyping" of global
        • "editBkgnd" of global
        • "localMaessages" of global
        • "lockScreen" of global
        • "lockRecent" of global
        • "longWindowTitles" of global
        • "powerKeys" of global
        • "textArrows" of global
        • "userModify" of global
        • "checkMark" of menu
        • "enabled" of menu
        • "dithering" of window
        • "hideIdle" of window
        • "hideUnused" of window
        • "visible" of window
        • "centered" of painting
        • "filled" of painting
        • "grid" of painting
        • "multiple" of painting
        • "cantAbort" of stack
        • "cantDelete" of stack
        • "cantModify" of stack
        • "cantPeek" of stack
        • "cantDelete" of background
        • "showPict" of background
        • "cantDelete" of card
        • "mark" of card
        • "showPict" of card
        • "autoTab" of field
        • "dontSearch" of field
        • "dontWrap" of field
        • "fixedLineHeight" of field
        • "lockText" of field
        • "sharedText" of background_field
        • "showLines" of field
        • "visible" of field
        • "wideMargins" of field
        • "autoHilite" of button
        • "hilite" of button
        • "sharedHilite" of background_button
        • "showName" of button
        • "visible" of button

        Points/Locations

        Uses Classes.

      19. POINT::=Net{horizontal, vertical:SANE_Numbers}.
      20. loc::=location,
      21. location::=point,
      22. point::classes=the CLASS (
        1. states=>POINT,
        2. constant=>( numeric.constant "," numeric.constant ),
        3. operator=>{},
        4. ...
        )

      23. located_events::={mouse,click,selected}.
      24. mouse::=the CLASS (
        1. states=>MOUSE,
        2. constant=>{}, operator=>{},
        3. function=>class+>{}, property=>class+>{}, global_property=>{}
        ).
      25. MOUSE::=
        Net{
        1. Loc::located_events->(()>+>point).
        2. commandKey::Boolean,
        3. optionKey::Boolean,
        4. shiftKey::Boolean,
        5. mouseClick::Boolean.
        6. mouse_button::{up,down}

        }=::MOUSE.

        Functions giving point

          "mouseLoc" with () "clickLoc" with () "selectedLoc" with ()
        Properties giving point
        • "botRight" of window
        • "bottomRight" of window
        • "globalLoc" of window
        • "location" of window
        • "loc" of window
        • "botRight" of field
        • "bottomRight" of field
        • "location" of field
        • "loc" of field
        • "topLeft" of field
        • "botRight" of button
        • "location" of button
        • "loc" of button
        • "topLeft" of button

        DatesEtc

        Uses Classes.

      26. date::classes=the CLASS (
        1. constant=>abbreviated_date|normal_date|long_date,
        2. operator=>{}, states=>Times,
        3. function=>(()+>(O("abbr"|"abbreviated"|"long") "date")
        4. global_property=>{}, property=>{}
        ).
      27. time::classes=the CLASS (
        1. constant=>literal_time|long_time,
        2. operator=>{}, states=>Times,
        3. function=>(()+>(O("long") "time")
        4. global_property=>{}, property=>{}
        ).

        date.functions=following,

          "date" of () "long" "date" of () "abbr" "date" of () "abbreviated" "date" of () date.property

        Rectangles

        Uses Classes.

      28. rectangle::classes=the CLASS (
        1. constant=>{}, states=>RECT,
        2. operator=>else+>{}, ...
        )

      29. RECT::=
        Net{
        1. left::SANE_Numbers,
        2. right::SANE_Numbers,
        3. top::SANE_Numbers,
        4. bottom::SANE_Numbers.
        5. center::=the POINT(horizontal=(left+right)/2,vertical= (top+bottom)/2).
        6. height::=1+bottom-top,
        7. width::=1+right-left.

        }=::RECT.
        for C:{window, card, button, field}, rectangle::C.objects->RECT.
      30. Rectangles.functions_etc::=following, Functions giving rectangle
        • "screenRect" with ()
        Properties giving rectangle
        • "globalRect" of window
        • "rectangle" of window
        • "rect" of window
        • "rectangle" of card
        • "rect" of card
        • "rectangle" of field
        • "rect" of field
        • "rectangle" of button
        • "rect" of button

      . . . . . . . . . ( end of section Data Types) <<Contents | End>>

      HyperCard Classes

        Backgrounds

        Uses Classes, Stacks,Numbers, Strings.

      1. background::=the CLASS (
        1. constant=>"background" ("id" numeric.constant|string.constant),
        2. operator=>class><class+>{},
        3. states=>$ Net{stack:stack, buttons:#button, fields:#field, ...},
        4. function=>#class+>{},
        5. global_property=>{},
        6. property=>class+>{}, ...
        ).


      2. (Properties)|-background.has_property=>( numeric+>{"number", "id"} | rectangle+>"rect" | string+>"script" | ...).


      3. |-for c:background.objects, for b:=c.states.buttons, i:1..|b| ( i=number(b(i)) and b(i).domain=background and b(i).on=c)
      4. |-for c:background.objects, and for f:=c.states.fields, i:1..|f| ( i=number(f(i)) and f(i).domain=background and b(i).on=c).

        Buttons

        Uses Texts, Classes, Numbers, Cards,Strings.

      5. button_style::="transparent" | "opaque" | "rectangle" | "shadow" | "roungRect" | "checkBox" | "radioButton".
      6. button::classes=the CLASS (
        1. constant=>O("card") "button" ("id" numeric.constant | numeric.constant | string.constant),
        2. states=>button_states,
        3. operator=>class><class+>{},
        4. function=>#class+>{}, global_property=>{}, property=>class+>{},...
        ).
      7. button_states::=$
        Net{
        1. hilight::Boolean,
        2. alignment::alignments,
        3. name::text,
        4. domain::{card, background},
        5. style::button_styles,
        6. number::numeric.constant,
        7. id::numeric.constant,
        8. rectangle::rectangle.states,
        9. on::card|background.
          }

      8. (above)|-button.has_property=>( numeric+>{"number", "id"} | point+>"loc" | rectangle+>"rect" | string+>"script"
      9. | text+>{"name", "textStyle"...) |... ).
      10. |-for all b:button.objects, if b.state.domain=card then for one c:card.objects(b in |c.state.buttons) else for one k:background.objects( b in |k.state.buttons).
      11. |-for all b:button.objects, b.on = the[c:(card|background).objects](b in |c.state.buttons).

        Cards

        Uses Numbers, Strings, Backgrounds.

      12. card::classes=the CLASS (
        1. constant=>"card" ("id" numeric.constant | numeric.constant | string.constant),
        2. operator=>class><class+>{},
        3. states=>CARD_STATE,
        4. function=>#class+>{},
        5. global_property=>{},
        6. property=>class+>{}
        ).
      13. CARD_STATE::=
        Net{
        1. stack::stack.objects,
        2. background::background.objects,
        3. buttons::#button,
        4. fields::#field, ...

        }=::CARD_STATE.

      14. (above)|-card.has_property=(numeric+>{"number", "id"} | rectangle+>"rect" | string+>"script" | ...)


      15. |-for c:card.objects, for b:=c.states.buttons, i:1..|b| ( i=number(b(i)) and b(i).domain=card and b(i).on=c) and for f:=c.states.fields, i:1..|f| ( i=number(f(i)) and f(i).domain=card and b(i).on=c).

        Containers

        Uses Fields, Strings.

      16. container::syntax=chunk_expression.
      17. whole_chunk::syntax="it" | field.expression | script.expression | string.expression.

      18. chunk_component.semantics::={char, word, item, line}.
      19. chunk_component.syntax::={"char", "word", "item", "line"}.
      20. part_of::=(char+>word | word+>item | {word,item}+>line | line+>{field, script,string})

      21. For c:chunk_component, chunk_selector(c)::= (c numeric.expression
      22. | ("first"|...|"last") c | c numeric.expresssion "to" numeric.expression)"of".

      23. chunk_expression::= O(chunk_selector("char") ) O(chunk_selector("word")) O(chunk_selector("item") ) O(chunk_selector("line") ) whole_chunk | chunk.().function.

        Functions returning chunks

        • "clickChunk" of ()
        • "selectedChunk" of ()
        • "foundChunk" of () chunk.property

        Fields

        Uses Texts, Classes, Numbers, Cards,Strings.

      24. field_styles::="transparent" | "opaque" | "rectangle" | "shadow" | "scrolling".

      25. field_states::= $
        Net{
        1. value::#text,
        2. alignment::alignments,
        3. domain::{card, background},
        4. number::numer-c.constant,
        5. id::numeric.constant,
        6. rectangle::rectangle.states,
        7. on::card|background,
        8. default_style::field_styles

        }=::field_states.

      26. field::classes=the CLASS (
        1. constant=>O("card") "field" ("id" numeric.constant | numeric.constant | string.constant),
        2. states=>field_States,
        3. operator=>class><class+>{},
        4. function=>()+>{"selectedField", "foundField"}|+>{}
        5. global_property=>{},
        6. property=>class->{},
        ).
      27. (above)|-field.has_property=>( numeric+>{"number", "id"} | point+>"loc" | rectangle+>"rect" | string+>"script" | ...).


      28. |-for all b:field.objects, if b.state.domain=card then for one c:card.objects(b in |c.state.field) else for one k:background.objects( b in |k.state.fields).
      29. |-for all b:field.objects, b.on = the[c:(card|background).objects](b in |c.state.fields).

        field.functions

        • "selectedField" of ()
        • "foundField" of ()

        Stacks

        Uses Classes,Numbers,Strings.

      30. stack::classes=the CLASS (
        1. constant=>"stack" ("id" numeric.constant | string.constant),
        2. operator=>class><class+>{}, states=>$ Net{ resources::#resource, ...}, ...
        ).

      31. home_stack::stack.objects.


      32. (above)|-stack.has_property<==( numeric+>{"number", "id"} | rectangle+>"rect" | string+>{"script", "name", ...}).

      . . . . . . . . . ( end of section HyperCard Classes) <<Contents | End>>

      HyperTalk

        Expressions

        Uses Classes, Containers, Meta.

      1. expression::classes->syntax.
      2. expression::(@class)->syntax=map[S](|[s:S]expression(s)).
      3. any_expression::=classes.expression. for all c:classes, s:c.expression, one m:c.objects (expression s has meaning m of type c).
      4. For all c, evaluate::c.expression->c.objects.states=fun[e:c.expression] (state(the [m:classes.objects.states](expression e has meaning m of type c))).
      5. (above)|-any_expression={s:syntax || for some t:class(s in t.expression)}.

      6. For t:classes, t.expression::= | following,
        • t.constant | "(" t.expression ")"
        • "the" t.global_property | "the" t.function
        • |[s:class] ("the" s.(t.property) "of" s.expression | s.(t.function) "(" s.expression ")")
        • |[s:class] ("the" s.(t.function) "of" s.expression | s.(t.operator) s.expression )
        • |[s1,s2:class]((s1,s2).(t.function) "(" s1.expression, s2.expression ")")
        • |[s1,s2:class](s1.expression ( (s1,s2).(t.operator) ) s2.expression )
        • |[s:#class](s.(t.function) "(" s;expression ")"
        • if( t=chunk, chunk_expression, {})
        • if( t=point or t=loc, numeric.expression comma numeric.expression, {})
        • if( t=rectangle, numeric.expression (comma numeric.expression)^3, {})
        • if( t=numeric, number_of_expression, {})
        • ...

      7. number_of_expression::="the number of"
      8. ( chunk_component "in" any_expression
      9. | ("card"|"bkgrnd"|"background"|)("fields"|"buttons")
      10. | ("cards" O("of" background.expression))
      11. | ("marked" | "menus" | "windows")
      12. | "menuItems" "of" menu.expression
      13. ).

        Commands

        Uses Expressions, Containers.

      14. command::syntax=| following,
        • "add" numeric.expression "to" container
        • "answer" string.expression O("with" string.expression #("or" string.expression))
        • "answer" "file" prompt O("of type" file_type)
        • "ask" string.expression O("with" string.expression)
        • "ask" "file" O( "with" string.expression)
        • "ask" "password" O("clear") prompt O("with" string.expression)
        • "beep" O(numeric.expression)
        • "choose" toolname "tool"
        • "click" "at" point.expression O( "with" modifier ("," modifier)^(0..2))
        • "close ("printing" | "file" file_name)
        • "convert" date.expression "to" date_format
        • "create" (menu.expression | "stack" stack.expression O( "with" background.expression) O("in" O("a") "new" "window")
        • "debug checkpoint"
        • "delete" component
        • "dial" phone_number O( "with" "modem" modem_commander)
        • "disable" O( menuItem.expression "of") menu.expression
        • "divide" container "by" numeric.expression
        • "do" statement.expression
        • "drag" "from" point.expression "to" point.expression O( "with" modifier ("," modifier)^(0..2))
        • "edit script of" object.expression
        • "enable" O( menuItem.expression "of") menu.expression
        • "exit to HyperCard"
        • "export paint to file" file_name
        • "find" O("normal") string.expression O("in" field.expression)
        • "find" ("chars"|"characters"|"string"|"whole") string.expression O("in" field.expression)
        • "flash" numeric.expression
        • "get" (expression | O("the") any_property "of" object | O("the") any_global_property)
        • "global" L(variable_name,",")
        • "go" O("to") ({card,background,stack}.expression) | ("next" | "prev"O("ious") | "first"|"last"|"any") "marked card" | stack.expression O("in a new window") | "marked card" positive_integer)
        • "help"
        • "hide" ( "card" | "background picture" | "menubar" | window_name | (button| field).expression | "titlebar" | "picture of" (card.expression | background.expression) )
        • "import paint from file" file_name
        • "lock screen"
        • "mark" ("all cards" | "cards by finding" string O("in" field.expression) | "cards where" boolean.expression
        • "multiply" container "by" numeric.expression
        • "open" O( document "with") application_program_name
        • "open" ("file" file_name)|"printing" O("with dialog")|"report printing with O("template" name| "dialog")
        • "palette" PLTE_resource_name O(comma point.expression)
        • "picture" name comma type comma window_style comma rectangle comma origin comma dithering
        • "play" sound_resource_name O("tempo" speed) O(#note O("#"|"b") O(octave) O(note_length)),
        • "pop card" O(("into" | "before" | "after") container)
        • "print" ( any_expression | file_name "with" application_program_name)
        • "print" ("all" |number) "cards" | "this" card | card.expression
        • "print" "card" O("from" point "to" point)
        • "print marked cards"
        • "push" O("this"|"recent") "card"
        • "put" any_expression ("into" | "after" |"before") O(menu_item.expression "of" menu.expression O("with menuMessages" message_name))
        • "put" any_expression O(("into" | "after" |"before") container)
        • "read from file" file_name ("for" nuemeric.expression|"until" boolean.expression)
        • "reset" ("menubar" | "paint" | "printing")
        • "return" any_expression
        • "save stack.expression "as" stack.expression
        • "select" ((button|field).expression|"me"|"target")
        • "select" (O("before"|"after") chunk.expression "of" ("Message Box"|field.expression)
        • "select empty"
        • "send" message_string "to" object.expression
        • "set O("the") (|[c:classes]((c.property "of" object | c.global_property) "to" c.expression)
        • "show ( (numeric.expression| "all" | "marked" )"cards"
        • "show" ( "menubar" | "titlebar" | window | (button | field).expression O("at" point.expression))
        • "sort" O("ascending"|"desceending|) O("text" | "numeric" | "international" | "datetime") "by" any_expression
        • "start using" stack.expression
        • "stop using" stack.expression
        • "subtract numeric.expression "from" container
        • "type" string.expression O("with commandKey")
        • "unlock screen" O("with" visual_effect_name O(speed) O("to" images)
        • "unmark" ("all cards" | "cards by finding" string O("in" field.expression) | "cards where" boolean.expression)
        • "visual" O("effect") visual_effect_name O(speed) O("to" images)
        • "wait" ("for" numeric.expression ("ticks"|"seconds") |("until" | "while") boolean.expression
        • "write" string.expression "to file" filename.
        Notes
        1. 2/25/93: Note: Define toolnames somewhere
        2. 7/5/96: component=chunk_component?

        Functions

        Uses Classes, Meta, Expressions.

      15. functions::@symbols.
      16. For x,d,r,m, (function x of () gives r meaning m)::@= (representation=>x, type=> r.objects.states, meaning=>m) in functions, (function x of d gives r meaning m)::@= (representation=>x, type=> d.objects->r.objects.states, meaning=>m) in functions.
      17. |-For c:classes, c.function=map[d:#classes]{x || for some m(function x of d gives c meaning m))}.
      18. |-function "date" of () gives date meaning date.
      19. |-function "long" "date" of () gives date meaning date.
      20. |-function "abbr" "date" of () gives date meaning date;abbreviated.
      21. |-function "abbreviated" "date" of () gives date meaning date;abbreviated.
      22. |-function "time" of () gives time meaning time;shorten.
      23. |-function "long" "time" of () gives time meaning time.
      24. |-function "seconds" of () gives numeric meaning int(ticks/60).
      25. |-function "secs" of () gives numeric meaning int(ticks/60).
      26. |-function "ticks" of () gives numeric meaning ticks.
      27. |-function "mouseH" of () gives numeric meaning mouse.Loc;horizontal.
      28. |-function "mouseV" of () gives numeric meaning mouse.Loc;vertical.
      29. |-function "mouseLoc" of () gives point meaning mouse.Loc.
      30. |-function "commandKey" of () gives boolean meaning commandKey.
      31. |-function "optionKey" of () gives boolean meaning optionKey.
      32. |-function "shiftKey" of () gives boolean meaning shiftKey.
      33. |-function "mouseClick" of () gives boolean meaning mouseClick.
      34. |-function "mouse" of () gives string & {"up", "down"} meaning mouse_button.
      35. |-function "clickH" of () gives numeric meaning click.Loc;horizontal.
      36. |-function "clickV" of () gives numeric meaning click.Loc;vertical.
      37. |-function "clickLoc" of () gives point meaning click.Loc.
      38. |-function "length" of string gives numeric meaning len.
      39. |-function "clickChunk" of () gives chunk meaning clickChunk.
      40. |-function "clickLine" of () gives string meaning clickLine.
      41. |-function "clickText" of () gives text meaning clickText.
      42. |-function "selectedChunk" of () gives chunk meaning selectedChunk.
      43. |-function "selectedLine" of () gives string meaning selectedLine.
      44. |-function "selectedText" of () gives text meaning selectedText.
      45. |-function "selectedField" of () gives field meaning selectedField.
      46. |-function "selectedLoc" of () gives point meaning selected.Loc.
      47. |-function "foundChunk" of () gives chunk meaning foundChunk.
      48. |-function "foundLine" of () gives string meaning foundLine.
      49. |-function "foundText" of () gives text meaning foundText.
      50. |-function "foundField" of () gives field meaning foundField.
      51. |-function "charToNum" of string gives numeric meaning charToNum.
      52. |-function "numToChar" of numeric gives string meaning numToChar.
      53. |-function "offset" of (string, string) gives numeric meaning offset.
      54. |-function "random" of () gives numeric meaning random.
      55. |-function "value" of any_expression gives any_class meaning evaluate.
      56. |-function "sound" of () gives string & ?? meaning sound.
      57. |-function "tool" of () gives string & toolnames meaning tool.
      58. |-function "version" of () gives numeric meaning version.
      59. |-function "screenRect" of () gives rectangle meaning screenRect.
      60. |-function "windows" of () gives numeric meaning windows.
      61. |-function "diskSpace" of () gives numeric meaning diskSpace.
      62. |-function "heapSpace" of () gives numeric meaning heapSpace.
      63. |-function "stackSpace" of () gives numeric meaning stackSpace.
      64. |-function "result" of () gives string meaning result.
      65. |-function "target" of () gives classes.objects.| meaning target.
      66. |-function "param" of () gives string meaning param.
      67. |-function "paramCount" of () gives numeric meaning paramCount.
      68. |-function "params" of () gives string meaning params.
      69. |-function "abs" of numeric gives numeric meaning abs.
      70. |-function "annuity" of (numeric, numeric) gives numeric meaning annuity.
      71. |-function "atan" of (numeric, numeric) gives numeric meaning atan.
      72. |-function "average" of #numeric gives numeric meaning average.
      73. |-function "compound" of (numeric, numeric) gives numeric meaning compound.
      74. |-function "cos" of numeric gives numeric meaning cos.
      75. |-function "exp" of numeric gives numeric meaning (e**_).
      76. |-function "exp1" of numeric gives numeric meaning exp1.
      77. |-function "exp2" of numeric gives numeric meaning (2**_).
      78. |-function "ln" of numeric gives numeric meaning ln.
      79. |-function "ln1" of numeric gives numeric meaning ln1.
      80. |-function "max" of #numeric gives numeric meaning max.
      81. |-function "min" of #numeric gives numeric meaning min.
      82. |-function "round" of numeric gives numeric meaning round.
      83. |-function "sin" of numeric gives numeric meaning sin.
      84. |-function "sqrt" of numeric gives numeric meaning sqrt.
      85. |-function "tan" of numeric gives numeric meaning tan.
      86. |-function "trunc" of numeric gives numeric meaning trunc.

        Notes


        1. 2/25/93: Note: Define toolnames somewhere

        Messages

        Uses Meta, Classes.

      87. messages::syntax=|[m:Message](m.syntax).
      88. message_string::@string.expression= /evaluate( messages). -- used in send
      89. Message::finite_set(MESSAGE). -- user can create messages at any time
      90. MESSAGE::=
        Net{
        1. syntax::syntax,
        2. entry::classes,
        3. arguments::#classes,
        4. meaning::??. ...

        }=::MESSAGE.
      91. CMP::=next_to,
      92. next_to::@(objects, objects)=button.objects;card | field.objects;card
      93. | card.objects;background | background.objects;stack
      94. | stack.objects; other_stacks| otherstacks; home_stack |
      95. home_stack;hypercard.
      96. For s,e,p,m, (message s with p sent to e means m)::@= the MESSAGE(syntax=>s, entry=>e, arguments=>p,meaning=>m, ...) in Message.

        1. |-message "newButton" with () sent to button means newButton.
        2. |-message "deleteButton" with () sent to button means deleteButton.
        3. |-message "mouseDown" with () sent to button means mouseDown.
        4. |-message "mouseStillDown" with () sent to button means mouseStillDown.
        5. |-message "mouseUp" with () sent to button means mouseUp.
        6. |-message "mouseEnter" with () sent to button means mouseEnter.
        7. |-message "mouseWithin" with () sent to button means mouseWithin.
        8. |-message "mouseLeave" with () sent to button means mouseLeave.
        9. |-message "newField" with () sent to field means newButton.
        10. |-message "deleteField" with () sent to field means deleteButton.
        11. |-message "mouseDown" with () sent to field means mouseDown.
        12. |-message "mouseStillDown" with () sent to field means mouseStillDown.
        13. |-message "mouseUp" with () sent to field means mouseUp.
        14. |-message "mouseEnter" with () sent to field means mouseEnter.
        15. |-message "mouseWithin" with () sent to field means mouseWithin.
        16. |-message "mouseLeave" with () sent to field means mouseLeave.
        17. |-message "openField" with () sent to field means openField.
        18. |-message "closeField" with () sent to field means closeField.
        19. |-message "exitField" with () sent to field means exitField.
        20. |-message "enterInField" with () sent to field means enterInField.
        21. |-message "returnInField" with () sent to field means returnInField.
        22. |-message "newCard" with () sent to card means newCard.
        23. |-message "deleteCard" with () sent to card means deleteCard.
        24. |-message "openCard" with () sent to card means openCard.
        25. |-message "closeCard" with () sent to card means closeCard.
        26. |-message "newBackground" with () sent to card means newBackground.
        27. |-message "deleteBackground" with () sent to card means deleteBackground.
        28. |-message "openBackground" with () sent to card means openBackground.
        29. |-message "closeBackground" with () sent to card means closeBackgroun.
        30. |-message "newStack" with () sent to card means newStack.
        31. |-message "deleteStack" with () sent to card means deleteStack.
        32. |-message "openStack" with () sent to card means openStack.
        33. |-message "closeStack" with () sent to card means closeStacK.
        34. |-message "mouseDown" with () sent to card means mouseDown.
        35. |-message "mouseStillDown" with () sent to card means mouseStillDown.
        36. |-message "mouseUp" with () sent to card means mouseUp.
        37. |-message "mouseDownInPicture" with () sent to card means mouseDown.
        38. |-message "keyDown" with (key) sent to card means keyDown.
        39. |-message "CommandKeyDown" with (key) sent to card means CommandKeyDown.
        40. |-message "returnKey" with () sent to card means returnKey.
        41. |-message "enterKey" with () sent to card means enterKey.
        42. |-message "tabKey" with () sent to card means tabKey.
        43. |-message "arrowKey" with (direction) sent to card means arrowKey.
        44. |-message "contrlKey" with (key) sent to card means contrlKey.
        45. |-message "functionKey" with (key) sent to card means functionKey.
        46. |-message "suspendStack" with () sent to card means suspendStack.
        47. |-message "resumeStack" with () sent to card means resumeStack.
        48. |-message "suspend" with () sent to card means suspend.
        49. |-message "resume" with () sent to card means resume.
        50. |-message "startup" with () sent to card means startup.
        51. |-message "quit" with () sent to card means quit.
        52. |-message "idle" with () sent to card means idle.
        53. |-message "doMenu" with () sent to card means doMenu.

        Notes
        1. 8/13/93: Define "other_stacks" somewhere

        Scripts

        Uses Meta, Commands, Expressions, Messages.

      97. script_states::=$
        Net{
        1. value::#(handler.syntax|function_handler.syntax),
        2. object::scripted_classes,...

        }=::script_states.

      98. script::classes=the CLASS (
        1. constant=>{}, operator=>{}, states=>script_states,
        2. function=>{}, global_property=>{},
        3. property=>{button, field, card, background, stack}+>"script"
        ).
      99. handler::syntax={ "on" m SP a CR hypertalk_sequence(0,0,m) "end" m CR || m:messages, a:arguments}. ??function_handler::syntax={ "function" m SP a CR hypertalk_sequence(0,0,m) "end" m CR || m:messages, a:arguments} & (#char "return" #char). ?
      100. For l,r:Nat0, m:message, hypertalk_sequence(l,r, m):syntax::=commands handling m at level l inside r repeats
      101. arguments::=L(variables). In a script, expressions can include "me" and "target". For l,r:Nat0, m:message,
      102. hypertalk_sequence(l,r,m)::syntax=# (hypertalk_command(l,r,m) CR),
      103. hypertalk_sequence(l,r,m)::formatted=# (HT^l hypertalk_command(l,r,m) CR),
      104. hypertalk_command(l,r,m)::= simple_command(l,r,m)| compound_command(l,r,m),
      105. compound_command(l,r,m)::= selection(l,r,m) | iteration(l,r,m).
      106. For l,m, simple_command(l,0,m)::=("exit" | "pass") m | command | message L(any_expression).
      107. For r:1.., l,m, simple_command(l,r,m)::=simple_command(l,0,m) | ("exit"| "next") "repeat".
      108. iteration(l,r,m)::=repeat_command CR hypertalk_sequence(l+1,r+1, m) "end" "repeat" CR.
      109. repeat_command::="repeat"
      110. ( O("forever")
      111. | "for" numeric.expresssion "times"
      112. | ("while" | "until") boolean.expression
      113. | "with" variable "=" numeric.expression O("down") "to" numeric.expression
      114. ) CR.
      115. For r,l,m, selection(l,r,m)::="if" if_part(l,r,m) #( "else" "if" if_part(l,r,m) )
      116. O( "else" CR hypertalk_sequence(l+1,r,m) )
      117. "end" "if" CR,
      118. if_part(l,r,m)::=boolean.expression "then" simple_command(l,r,m) CR
      119. | boolean.expression O(CR)"then" CR hypertalk_sequence(l+1,r,m).

        Properties giving script

        • "script" of stack
        • "script" of background
        • "script" of card
        • "script" of field
        • "script" of button

        Properties

        Uses Classes, Meta.

      120. properties::@symbols.
      121. For x:syntax, r:classes, m:r.objects, (property x of global gives r meaning m)::=(representation=>x, type=> r, meaning=>m) in properties.
      122. For x:syntax, d,r:classes, m:d.objects->r.objects, (property x of d gives r meaning m)::=(representation=>x, type=> d->r, meaning=>m) in properties.
      123. |-For c:classes, c.property=map[d]{x || for some m(property x of d gives c meaning m))} and c.global_property={x || for some m(property x of global gives c meaning m))}.


      124. |-property "blindTyping" of global gives boolean meaning blindTyping.
      125. |-property "cursor" of global gives numeric meaning cursor.
      126. |-property "debugger" of global gives string meaning debugger.
      127. |-property "dragSpeed" of global gives numeric meaning dragSpeed.
      128. |-property "editBkgnd" of global gives boolean meaning editBkgnd.
      129. |-property "language" of global gives string meaning language.
      130. |-property "localMessages" of global gives boolean meaning localMaessages.
      131. |-property "lockScreen" of global gives boolean meaning lockScreen.
      132. |-property "lockRecent" of global gives boolean meaning lockRecent.
      133. |-property "longWindowTitles" of global gives boolean meaning longWindowTitles.
      134. |-property "messageWatcher" of global gives string meaning messageWatcher.
      135. |-property "numberFormat" of global gives string meaning numberFormat.
      136. |-property "powerKeys" of global gives boolean meaning powerKeys.
      137. |-property "printMargin" of global gives {left, top, right, bottom} meaning printMargin.
      138. |-property "printTextAlign" of global gives alignment meaning printTextAlign.
      139. |-property "printTextFont" of global gives fonts meaning printTextFont.
      140. |-property "printTextHeight" of global gives numeric meaning printTextHeight.
      141. |-property "printTextSize" of global gives numeric meaning printTextSize.
      142. |-property "printTextStyle" of global gives text_style meaning printTextStyle.
      143. |-property "scriptEditor" of global gives string meaning scriptEditor.
      144. |-property "scriptTextFont" of global gives fonts meaning scriptTextFont.
      145. |-property "scriptTextSize" of global gives numeric meaning scriptTextSize.
      146. |-property "StacksInUse" of global gives string meaning StacksInUse.
      147. |-property "textArrows" of global gives boolean meaning textArrows.
      148. |-property "userLevel" of global gives numeric & 1..5 meaning userLevel.
      149. |-property "userModify" of global gives boolean meaning userModify.
      150. |-property "variableWatcher" of global gives string meaning variableWatcher.


      151. |-property "checkMark" of menu gives boolean meaning checkMark.
      152. |-property "cmdChar" of menu gives char meaning command_character.
      153. |-property "commandChar" of menu gives char meaning command_character.
      154. |-property "enabled" of menu gives boolean meaning enabled.
      155. |-property "markChar" of menu gives char meaning markChar.
      156. |-property "menuMessage" of menu gives string meaning menuMessage.
      157. |-property "menuMsg" of menu gives string meaning menuMessage.
      158. |-property "name" of menu gives string meaning name.


      159. |-property "botRight" of window gives point meaning rectangle; (right, bottom).
      160. |-property "bottom" of window gives integer meaning rectangle; bottom.
      161. |-property "bottomRight" of window gives point meaning rectangle; (bottom,right).
      162. |-property "buttonCount" of window gives numeric meaning buttonCount.
      163. |-property "commands" of window gives string & return_delimitted_list meaning commands.
      164. |-property "dithering" of window gives boolean meaning dithering.
      165. |-property "globalLoc" of window gives point meaning global_rectangle; center.
      166. |-property "globalRect" of window gives rectangle meaning global_rectangle.
      167. |-property "hBarLoc" of window gives numeric meaning hBarLoc.
      168. |-property "height" of window gives numeric meaning rectangle; height.
      169. |-property "hideIdle" of window gives boolean meaning hideIdle.
      170. |-property "hideUnused" of window gives boolean meaning hideUnused.
      171. |-property "hilitedButton" of window gives numeric meaning hilitedButton.
      172. |-property "left" of window gives numeric meaning rectangle; left.
      173. |-property "location" of window gives point meaning rectangle; center.
      174. |-property "loc" of window gives point meaning rectangle; center.
      175. |-property "nextLine" of window gives expression meaning nextLine.
      176. |-property "properties" of window gives string & comma_list meaning properties.
      177. |-property "rectangle" of window gives rectangle meaning rectangle.
      178. |-property "rect" of window gives rectangle meaning rectangle.
      179. |-property "right" of window gives numeric meaning rectangle;right.
      180. |-property "scale" of window gives numeric & -5..5 meaning scale.
      181. |-property "scroll" of window gives numeric meaning scroll.
      182. |-property "top" of window gives numeric meaning rectangle;top.
      183. |-property "topLeft" of window gives numeric meaning rectangle;(left,top).
      184. |-property "vBarLoc" of window gives numeric meaning vBarLoc.
      185. |-property "visible" of window gives boolean meaning visible.
      186. |-property "width" of window gives numeric meaning width.
      187. |-property "zoom" of window gives string & {"in", "out"} meaning zoom.


      188. |-property "brush" of painting gives numeric & 1..5 meaning brush.
      189. |-property "centered" of painting gives boolean meaning centered.
      190. |-property "filled" of painting gives boolean meaning filled.
      191. |-property "grid" of painting gives boolean meaning grid.
      192. |-property "lineSize" of painting gives numeric & {1, 2,3,4,6,8} meaning lineSize.
      193. |-property "multiple" of painting gives boolean meaning multiple.
      194. |-property "multiSpace" of painting gives numeric & 1..9 meaning multiSpace.
      195. |-property "pattern" of painting gives numeric & 1..40 meaning pattern.
      196. |-property "polySides" of painting gives numeric & 3.. meaning polySides.
      197. |-property "textAlign" of painting gives alignment meaning textAlign.
      198. |-property "textFont" of painting gives fonts meaning textFont.
      199. |-property "textHeight" of painting gives leading meaning textHeight.
      200. |-property "textSize" of painting gives numeric meaning textSize.
      201. |-property "textStyle" of painting gives text_style meaning textStyle.


      202. |-property "cantAbort" of stack gives boolean meaning cantAbort.
      203. |-property "cantDelete" of stack gives boolean meaning cantDelete.
      204. |-property "cantModify" of stack gives boolean meaning cantModify.
      205. |-property "cantPeek" of stack gives boolean meaning cantPeek.
      206. |-property "freesize" of stack gives bytes meaning freesize.
      207. |-property "size" of stack gives bytes meaning size.
      208. |-property "name" of stack gives string meaning name.
      209. |-property "script" of stack gives script meaning script.


      210. |-property "cantDelete" of background gives boolean meaning cantDelete.
      211. |-property "id" of background gives numeric meaning id.
      212. |-property "name" of background gives string meaning name.
      213. |-property "number" of background gives numeric meaning number.
      214. |-property "script" of background gives script meaning script.
      215. |-property "showPict" of background gives boolean meaning showPict.


      216. |-property "cantDelete" of card gives boolean meaning cantDelete.
      217. |-property "id" of card gives numeric meaning id.
      218. |-property "name" of card gives string meaning name.
      219. |-property "mark" of card gives boolean meaning mark.
      220. |-property "name" of card gives string meaning name.
      221. |-property "number" of card gives numeric meaning number.
      222. |-property "rectangle" of card gives rectangle meaning rectangle.
      223. |-property "rect" of card gives rectangle meaning rectangle.
      224. |-property "script" of card gives script meaning script.
      225. |-property "showPict" of card gives boolean meaning showPict.


      226. |-property "autoTab" of field gives boolean meaning autoTab.
      227. |-property "botRight" of field gives point meaning rectangle;(right,bottom).
      228. |-property "bottom" of field gives numeric meaning rectangle;bottom.
      229. |-property "bottomRight" of field gives point meaning rectangle;(right,bottom).
      230. |-property "dontSearch" of field gives boolean meaning dontsearch.
      231. |-property "dontWrap" of field gives boolean meaning dontWrap.
      232. |-property "fixedLineHeight" of field gives boolean meaning fixedLineHeight.
      233. |-property "height" of field gives numeric meaning rectangle;height.
      234. |-property "id" of field gives numeric meaning id.
      235. |-property "left" of field gives numeric meaning rectangle;left.
      236. |-property "location" of field gives point meaning rectangle;center.
      237. |-property "loc" of field gives point meaning rectangle;center.
      238. |-property "lockText" of field gives boolean meaning lockText.
      239. |-property "name" of field gives string meaning name.
      240. |-property "number" of field gives numeric meaning number.
      241. |-property "rectangle" of field gives rectangle meaning rectangle.
      242. |-property "rect" of field gives rectangle meaning rectangle.
      243. |-property "script" of field gives script meaning script.
      244. |-property "scroll" of field gives pixels meaning scroll.
      245. |-property "sharedText" of background_field gives boolean meaning sharedText.
      246. |-property "showLines" of field gives boolean meaning showLines.
      247. |-property "style" of field gives string & field_style meaning style.
      248. |-property "textAlign" of field gives alignment meaning textAlign.
      249. |-property "textFont" of field gives string & fonts meaning textFont.
      250. |-property "textHeight" of field gives numeric meaning textHeight.
      251. |-property "textSize" of field gives numeric meaning textSize.
      252. |-property "textStyle" of field gives string & text_style meaning textStyle.
      253. |-property "top" of field gives numeric meaning rectangle;top.
      254. |-property "topLeft" of field gives point meaning rectangle;(left,top).
      255. |-property "visible" of field gives boolean meaning visible.
      256. |-property "wideMargins" of field gives boolean meaning wideMargins.
      257. |-property "width" of field gives numeric meaning rectangle;width.


      258. |-property "autoHilite" of button gives boolean meaning autoHilite.
      259. |-property "botRight" of button gives point meaning rectangle;(right, bottom).
      260. |-property "bottom" of button gives numeric meaning rectangle; bottom.
      261. |-property "bottomRight" of button gives numeric meaning rectangle;(right, bottom).
      262. |-property "height" of button gives numeric meaning rectangle;height.
      263. |-property "hilite" of button gives boolean meaning hilite.
      264. |-property "icon" of button gives numeric meaning icon.
      265. |-property "id" of button gives numeric meaning id.
      266. |-property "left" of button gives numeric meaning left.
      267. |-property "location" of button gives point meaning rectangle;center.
      268. |-property "loc" of button gives point meaning rectangle;center.
      269. |-property "name" of button gives string meaning name.
      270. |-property "number" of button gives numeric meaning number.
      271. |-property "rectangle" of button gives rectangle meaning rectangle.
      272. |-property "rect" of button gives rectangle meaning rectangle.
      273. |-property "right" of button gives numeric meaning rectangle;right.
      274. |-property "script" of button gives script meaning script.
      275. |-property "sharedHilite" of background_button gives boolean meaning sharedHilite.
      276. |-property "showName" of button gives boolean meaning showName .
      277. |-property "style" of button gives string & button_style meaning style.
      278. |-property "textAlign" of button gives alignment meaning textAlign.
      279. |-property "textFont" of button gives fonts meaning textFont.
      280. |-property "textHeight" of button gives numeric meaning textHeight.
      281. |-property "textSize" of button gives numeric meaning textSize.
      282. |-property "textStyle" of button gives text_style meaning textStyle.
      283. |-property "top" of button gives numeric meaning rectangle;top.
      284. |-property "topLeft" of button gives point meaning rectangle;(left, top).
      285. |-property "visible" of button gives boolean meaning visible.
      286. |-property "width" of button gives numeric meaning rectangle;width.

      . . . . . . . . . ( end of section HyperTalk) <<Contents | End>>

      See Also

    1. ASCII::= See http://www.csci.csusb.edu/dick/samples/comp.text.ASCII.html.
    2. STANDARD::= See http://www.csci.csusb.edu/dick/maths/maths_11_STANDARD.html.

    . . . . . . . . . ( end of section HyperTalk Handbook) <<Contents | End>>

  1. CR::="Computer Reviews", [ http://www.reviews.com/ ] and [ browse_reviewers.cfm?reviewer_id=115728 ]

End