Forth Lecture L7.1
A Brief History of Programming Languages
How would you have a computer evaluate this expression? X = A*B + (C – D)/(E + F) Reverse Polish Notation (RPN) Postfix AB*CD-EF+/+
Forth
WHYP Pronounced “whip” “Words to Help You Program” Subroutine-threaded Forth for Embedded Systems –68HC11 (16-bit) –68332 (32-bit) –68HC12 (16-bit)
WHYP is developed from scratch in the book: Design of Embedded Systems Using 68HC12/11 Microcontrollers by Richard E. Haskell Prentice Hall, 2000
FORTH is a programming language that --- was invented by Charles Moore in the early 70’s is extensible keeps all definitions in a dictionary is extremely compact is recursive can be programmed in RAM, PROM, or ROM is structured uses a stack and postfix notation
Chuck Moore reading Haskell’s WHYP book
WHYP Colon Definitions : squared( n -- n**2) DUP * ; : cubed( n -- n**3) DUP\ n n squared \ n n**2 * ;\ n**3
Branching and Looping in WHYP IF…ELSE…THEN FOR…NEXT BEGIN…AGAIN BEGIN…UNTIL BEGIN…WHILE…REPEAT
IF…ELSE…THEN IF ELSE THEN is either TRUE (-1) or FALSE (0)
WHYP Conditional Words <( n1 n2 -- f )(“less-than”) >( n1 n2 -- f )(“greater-than”) =( n1 n2 -- f )(“equals”) <>( n1 n2 -- f )(“not-equals”) <=( n1 n2 -- f )(“less-than or equal”) >=( n1 n2 -- f )(“greater-than or equal”) 0<( n -- f)(“zero-less”) 0>( n -- f)(“zero-greater”) 0=( n -- f)(“zero-equal”) U<( u1 u2 -- f )(“U-less-than”) U>( u1 u2 -- f )(“U-greater-than”) U<=( u1 u2 -- f )(“U-less-than or equal”) U>=( u1 u2 -- f )(“U-greater-than or equal”)
Do different things depending what is in T : checkT( n -- ) DUP 1 =\ n f IF\ n DO1\ ELSE\ n DUP 2 =\ n f IF\ n DO2 ELSE\ n DUP 3 =\ n f IF\ n DO3 ELSE\ n DO4 THEN\ THEN THEN ;
>R Decrement top of return stack and branch back to if not equal to zero. Therefore, are executed n times. FOR…NEXT Loop n FOR NEXT drjne
BEGIN…AGAIN BEGIN AGAIN
BEGIN…UNTIL BEGIN UNTIL is either TRUE or FALSE usually from some WHYP conditional word
: GET.BTN ( -- n ) BEGIN 0= UNTIL BEGIN UNTIL CHECKT AGAIN ;
BEGIN…WHILE…REPEAT BEGIN WHILE REPEAT
x = 1 i = 2 DO WHILE i <= n x = x * i i = i + 1 ENDDO factorial = x : factorial ( n -- n! ) 1 2 ROT \ x i n BEGIN \ x i n 2DUP <= \ x i n f WHILE \ x i n -ROT TUCK \ n i x i * SWAP \ n x i 1+ ROT \ x i n REPEAT \ x i n 2DROP ; \ x Factorial