home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 2: PC / frozenfish_august_1995.bin / bbs / d10xx / d1042.lha / Programs / E3_Docs / E.doc < prev    next >
Text File  |  1992-09-02  |  220KB  |  6,288 lines

  1.  
  2.         +-----------------------------------------------+
  3.         |                        |
  4.         |                 Amiga E v3.1a                 |
  5.         |          Compiler for The E Language          |
  6.         |           By Wouter van Oortmerssen           |
  7.         |                        |
  8.         +-----------------------------------------------+
  9.  
  10.  
  11. Contents:
  12.  
  13.      0. compiler and introduction
  14.         A. introduction
  15.         B. the distribution
  16.         C. demo restrictions, registration and sites
  17.         D. using the compiler
  18.         E. changes from v2.1b to v3.0a, and from v3.0a to v3.1a
  19.         F. additional information
  20.  
  21.      1. format
  22.         A. tabs,lf etc.
  23.         B. comments
  24.         C. identifiers and types
  25.  
  26.      2. immediate values
  27.         A. decimal (1)
  28.         B. hexadecimal ($1)
  29.         C. binary (%1)
  30.         D. float (1.0)
  31.         E. character
  32.         F. strings ('bla')
  33.         G. lists ([1,2,3]) and typed lists
  34.         H. lisp-cells (<a|b>)
  35.  
  36.      3. expressions
  37.         A. format
  38.         B. precedence and grouping
  39.         C. types of expressions
  40.         D. function calls
  41.  
  42.      4. operators
  43.         A. math (+ - * /)
  44.         B. comparison (= <> > < >= <=)
  45.         C. logical and bitwise (AND OR)
  46.         D. unary (SIZEOF ` ^ {} ++ -- -)
  47.         E. triple (IF THEN ELSE)
  48.         F. structure (.)
  49.         G. array ([])
  50.         H. float operator (!)
  51.         I. assignments expressions (:=)
  52.         J. sequencing (BUT)
  53.         K. dynamic memory allocation (NEW)
  54.         L. unification (<=>)
  55.         M. pointer typing (::)
  56.  
  57.      5. statements
  58.         A. format (;)
  59.         B. statement labels and gotos (JUMP)
  60.         C. assignment (:=)
  61.         D. assembly mnemonics
  62.         E. conditional statement (IF)
  63.         F. for-statement (FOR)
  64.         G. while-statement (WHILE)
  65.         H. repeat-statement (REPEAT)
  66.         I. loop-statement (LOOP)
  67.         J. select-case-statement (SELECT)
  68.         K. increase statement (INC/DEC)
  69.         L. void expressions (VOID)
  70.         M. memory deallocation (END)
  71.  
  72.      6. function definitions and declarations
  73.         A. proc definition and arguments (PROC)
  74.         B. local and global definitions: scope (DEF)
  75.         C. endproc/return
  76.         D. the `main' function
  77.         E. built-in system variables
  78.         F. default arguments to functions
  79.         G. multiple return values
  80.         H. function values
  81.  
  82.      7. declaration of constants
  83.         A. const (CONST)
  84.         B. enumerations (ENUM)
  85.         C. sets (SET)
  86.         D. built-in constants
  87.  
  88.      8. types
  89.         A. about the `type' system
  90.         B. the basic type (LONG/PTR)
  91.         C. the simple type (CHAR/INT/LONG)
  92.         D. the array type (ARRAY)
  93.         E. the complex type (STRING/LIST)
  94.         F. the compound type (OBJECT)
  95.         G. initialisation
  96.         H. the essentials of the E typesystem
  97.  
  98.      9. built-in functions
  99.         A. io functions
  100.         B. strings and string functions
  101.         C. lists and list functions
  102.         D. intuition support functions
  103.         E. graphics support functions
  104.         F. system support functions
  105.         G. math and other functions
  106.         H. string and list linking functions
  107.         I. lisp-cells and cell functions
  108.  
  109.     10. library functions and modules
  110.         A. built-in library calls
  111.         B. interfacing to the amiga system with the v39 modules
  112.         C. compiling own modules
  113.         D. the modulecache
  114.  
  115.         11. quoted expressions
  116.         A. quoting and scope
  117.         B. Eval()
  118.         C. built-in functions
  119.  
  120.         12. floating point support
  121.         A. float values
  122.         B. computing with floats
  123.         C. builtin float functions
  124.         D. float implementation issues
  125.  
  126.     13. Exception handling
  127.         A. defining exception handlers (HANDLE/EXCEPT)
  128.         B. using the Raise() function
  129.         C. defining exceptions for built-in functions (RAISE/IF)
  130.         D. use of exception-ID's
  131.  
  132.         14. OO programming
  133.         A. OO features in E
  134.         B. object inheritance
  135.         C. data hiding (EXPORT/PRIVATE/PUBLIC)
  136.         D. methods and virtual methods
  137.         E. Constructors, Destructors and Super-Methods (NEW,END,SUPER)
  138.  
  139.     15. inline assembly
  140.         A. identifier sharing
  141.         B. the inline assembler compared to a macro assembler
  142.         C. ways using binary data (INCBIN/CHAR..)
  143.         D. OPT ASM
  144.         E. Inline asm and register variables
  145.  
  146.     16. technical and implementation issues
  147.         A. the OPT keyword
  148.         B. small/large model
  149.         C. stack organisation
  150.         D. hardcoded limits
  151.         E. error messages, warnings and the unreferenced check
  152.         F. compiler buffer organisation and allocation
  153.         G. register allocation
  154.  
  155.     17. Essential E Utilities / Applications
  156.         A. ShowModule
  157.         B. ShowHunk
  158.         C. Pragma2Module / Iconvert
  159.         D. ShowCache / FlushCache
  160.         E. ecompile.rexx
  161.         F. o2m
  162.         G. E-Yacc
  163.         H. SrcGen
  164.         I. EBuild
  165.         J. EE / Aprof
  166.         K. EDBG
  167.         L. EC PreProcessor
  168.  
  169.     18. Appendices
  170.         A. E Grammar description
  171.         B. Tutorial
  172.         C. Mapping E to C/C++/Pascal/Ada/Lisp etc.
  173.         D. Amiga E FAQ
  174.  
  175.  
  176.  
  177.  
  178. +-----------------------------------------------------------------------+
  179. |                    0. COMPILER AND INTRODUCTION            |
  180. +-----------------------------------------------------------------------+
  181.  
  182. 0A. introduction
  183. ----------------
  184. E is an object oriented / procedural / unpure functional higher programming
  185. language, mainly influenced by languages such as C++, Ada, Lisp etc. It is
  186. a general-purpose programming language, and the Amiga implementation is
  187. specifically targeted at programming system applications. The number of
  188. features of the language is really too great to sum up entirely (see 0E where
  189. some of the features new in v3 are listed), and include:
  190. speed of >20000 lines/minute on a 7 Mhz amiga, inline assembler and linker
  191. integrated into compiler, large set of integrated functions, great module
  192. concept with v39 includes as modules, flexible type-system, quoted
  193. expressions, immediate and typed lists, low-level and object polymorphism,
  194. exception handling, inheritance, data-hiding, methods, multiple return
  195. values, default arguments, register allocation, fast memory management,
  196. unification, LISP-Cells, (macro-) preprocessor, source-level debugger,
  197. and much more...
  198.  
  199. This is what 'HelloWorld' looks like in E:
  200.  
  201. /* nominated for Most Boring Example */
  202.  
  203. PROC main()
  204.   WriteF('Hello, World!\n')
  205. ENDPROC
  206.  
  207.  
  208. 0B. the distribution
  209. --------------------
  210. The distribution includes:
  211.  
  212. bin/        contains the compiler EC and the support utilities
  213. modules/    Directory containing all Amiga v39 E modules and
  214.         useful tools as linkable modules
  215. docs/        documentation on E
  216. src/        example sources in E
  217. tools/        optional tools for use with E
  218.  
  219. This distribution of Amiga E v3.0 including the demo version of the
  220. compiler is FreeWare, and may be freely copied. The compiler archive some
  221. of you may have received together with this archive, however, is NOT
  222. FreeWare and should NOT be copied for anyone but yourself.
  223.  
  224. Distributing copies of E for more than the price of disk+postage (generally
  225. <3$), or any other way of distribution with only the slightest aim of making
  226. profit, is not allowed. I explicitly forbid Serge Hammouche or his company
  227. "France Festival Distribution" to distribute E in any shape or form. He has
  228. done so in the past without my permission, misusing my name and stealing money
  229. from me on the backs of french E programmers. If you paid him money, claim
  230. it back and spread the word. A french translation of this document authorized
  231. by me (made by Olivier Anh) is available on aminet.
  232.  
  233. This distribution should always be distributed as a whole, i.e. in the form
  234. of the original .lha archive. No additions, modifications, translations,
  235. partial distributions or whatever are allowed without my explicit permission.
  236.  
  237. No guarantees, no warranty. If you manage to drown your pet goldfish using E,
  238. or E fails to be suitable for ordering pizzas, that's entirely your problem.
  239. Whatever happens, don't blame it on me.
  240.  
  241. Fred Fish has special permission to distribute E on his CD-ROM's.
  242.  
  243.  
  244. 0C. demo restrictions, registration and sites
  245. ---------------------------------------------
  246. The Amiga E distribution is PD, and contains the demo version of
  247. the compiler. registered programmers obtain the full compiler as
  248. a separate archive, with only "EC" in it.
  249.  
  250. If you have received the registered EC already, you may wish to put
  251. it in the bin directory. The distribution archive may be freely
  252. copied for anyone (see 0B on that), but please make sure you do not
  253. distribute your registered copy of EC to anyone, not even to friends.
  254. I haven't serialised these copies because of the confidence I have
  255. in my registered users, so don't break it. Registration is very
  256. affordable, and v2.1b is still available, so there's no excuse left
  257. for pirating E.
  258.  
  259. So what's "demo" about the included compiler?
  260. The compiler will only spit out executables <8k, above that it will present
  261. you with a "workspace full" error. Other than that it's fully functional.
  262.  
  263. You are allowed to evaluate this demo for _two weeks_, after which you decide
  264. either to register or quit using this demo version, even if you only write
  265. programs <8k. [this used to be 12k, yes. guess why it changed.]
  266.  
  267. updates.
  268. distribution updates can be found in the PD as normal, and updates
  269. to the registered EC will be distributed as patches, also in the PD.
  270.  
  271. ordering a copy.
  272. The basic price is 40$.
  273. - subtract 5$ if you are prepared to receive your registered EC per
  274.   uuencoded E-mail instead of on disk. This is the fastest way to get v3.
  275. - add 10$ for each major update you wish to receive (if they are released)
  276.   This is only for people living in Siberia or similar, since updates
  277.   are available in the PD.
  278. - contact me for large quantity orders.
  279.  
  280. I will allow payment in some other currencies as well, to simplify
  281. payment for some people. No rare currencies please.
  282.  
  283. examples (US$):                40
  284.  
  285. Dutch Guilders (highly preferred)    65
  286. German DeutchMark            60
  287. Etc...
  288.  
  289. NOTE: these are calculated from transaction prices on 30 june 94,
  290. if your currency starts to plummet, you'll have to adjust. making
  291. sure you're 1$ above the guilder-price seems ok.
  292.  
  293. Getting the money to me.
  294. This is not simple, since most banks charge a lot for foreign money
  295. transfers. Some options:
  296.  
  297. - Sending cash (preferred). This may sound spooky, but it actually
  298.   is the most succesful way of getting money across. Changing your
  299.   money to dutch paper-money is always a good idea. If you feel insecure
  300.   about mailing money, most post-offices offer a service that will
  301.   report back to you that everything safely arrived at my place.
  302.   [40$]
  303.  
  304. - Send a "Mandat the poste international". This has worked from
  305.   for example France and Italy without problems
  306.   [40$]
  307.  
  308. - within Europe, send a EuroCheque (in guilders). I believe there are
  309.   no costs for this, but check locally. [make sure you mark "DFL" as
  310.   currency!]
  311.   [40$]
  312.  
  313. - Transferring directly to my bank account:
  314.     427875951, ABN-AMRO bank, the netherlands
  315.   or my post-giro account:
  316.     6030387, PostBank, the netherlands
  317.   make sure you cover any transfer costs your bank may charge you,
  318.   and/or may charge me. for example postbank transfer from outside
  319.   the netherlands costs 4$, bank transfers can be up to 10$
  320.   [44$ to 50$, netherlands: 40$]
  321.  
  322. - Do **NOT** send CHEQUES, MONEY ORDERs or similar methods of payment.
  323.   Cheques (other than the EuroCheques above) banks here ask 15$ tranfer costs
  324.   for to cash (if I can cash them at all).
  325.   [50$ to 55$]
  326.  
  327. You may choose any (other) method, but in general realise that it's YOUR
  328. task to make sure I am able to cash the full amount of money _easily_.
  329. If you do not take transfer costs into account and the final amount
  330. is less than 40$, you'll have to do yet another transfer before you can
  331. get your registrated version.
  332.  
  333. Make sure you send as complete info with the money as possible, i.e.
  334. full address, internet E-mail, maybe even Amiga-config etc. I'm not
  335. going to write out one of those silly registration forms here :-)
  336.  
  337. my address: (see 0F)
  338.  
  339.  
  340. You can also register at one of the authorized E registration sites
  341. in Australia, England, the U.S.A. or Germany (Italy soon):
  342.  
  343. Australia:    Rob Nottage        (information below)
  344. England:    Jason R. Hulance    (information below)
  345. U.S.A.:        Barry Wills        (information below)
  346. Germany:    J÷rg Wach        (no full information yet)
  347. Italy:        -            (no confirmation yet)
  348.  
  349. Below is some information from the various sites, for more info contact
  350. them personally. Residents in nearby countries may choose at their option
  351. to registrate at these sites as well. Note that generally the same rules
  352. go for sites as well: whatever your method of payment, make sure the
  353. correct amount is received by the site.
  354.  
  355.  
  356. GERMANY
  357.  
  358. name:        J÷rg Wach
  359. address:    Waitzstr. 75, 24105 Kiel, Deutschland/Germany
  360. email:        JCL_POWER@freeway.sh.sub.de
  361. price:        60dm postal delivery, 54dm via email
  362.  
  363.  
  364. AUSTRALIA
  365.  
  366. name:        Rob Nottage
  367. address:    10 Chilver Street, Kewdale, Western Australia, 6105
  368. Fax:        (09) 458 0154
  369. FidoNet:    3:690/662.0
  370. AmigaNet:    41:616/662.0
  371. Internet:    robbage@cougar.multiline.com.au
  372. BBS:        (09) 351 8401  v.32, v.42bis.
  373. price:        AUS$ 55 (postage or fidonet crashmail), AUS$ 50 (internet
  374.         or fidonet email), depending on current exchange rates
  375. payment:    - Postal or money order (preferred)
  376.         - personal or bank cheque (you pay the cost)
  377.         - direct transfer to bank account (National Australia Bank,
  378.           fill out a deposite slip for the correct amount, account#
  379.           086131 435770223, 'Robert K. Nottage')
  380.         - Sending cash (your risk)
  381.  
  382.  
  383. ENGLAND
  384.  
  385. name:        Jason R. Hulance  (Dept. E)
  386. address:    Formal Systems (Europe) Ltd, 3 Alfred Street, Oxford OX1 4EH, ENGLAND
  387. telephone:    (0869) 324350, out of office hours.
  388. email:        m88jrh@ecs.ox.ac.uk
  389. price:        26 UK pounds (on disk) or 23 UK pounds (via E-mail)
  390.         "Beginner's Guide to Amiga E" (182 pages) is available in AmigaGuide, TeX,
  391.         PostScript and printed forms with a large index. This costs 5 UK pounds
  392.         (non-printed forms) or 10 UK pounds (printed form).
  393. payment:    For safety, please make payment by cheque (payable to "Jason Hulance"),
  394.         although postal orders/cash/bank transfers will also be accepted
  395.  
  396.  
  397. U.S.A.
  398.  
  399. name:        Barry Wills
  400. address:    5528D Pryor Dr., SAFB, IL 62225
  401. email:        el269@cleveland.freenet.edu
  402. price:        40$ (US mail), 35$ (internet email)
  403. payment:    - money order or cashier check: preferred method.
  404.         - cash - Okay, but AT YOUR OWN RISK.
  405.         - personal check: Okay, but expect delays of up to 3 weeks for
  406.           shipment of your registered compiler.
  407.  
  408.  
  409.  
  410.  
  411. 0D. using the compiler
  412. ----------------------
  413.  
  414. To install Amiga E on your system, just copy the whole distribution to
  415. some place in your system, extend your path to the BIN directory, and
  416. assign EMODULES: to the MODULES directory.
  417.  
  418. syntax of the compiler (2.04+):
  419.  
  420. SOURCE/A,REG=NUMREGALLOC/N/K,LARGE/S,SYM=SYMBOLHUNK/S,NOWARN/S,QUIET/S,
  421. ASM/S,ERRLINE/S,ERRBYTE/S,SHOWBUF/S,ADDBUF/N/K,IGNORECACHE/S,HOLD/S,WB/S,
  422. LINEDEBUG/S,OPTI/S,DEBUG/S:
  423.  
  424. for 1.2 to 2.03:
  425.  
  426. EC [-opts] <sourcefile>
  427.  
  428. As an example we'll compile the program 'HelloWorld.e'. The compiler will
  429. produce an executable 'HelloWorld'.
  430.  
  431. E:>  ec helloworld
  432. AmigaáEáCompiler/Assembler/Linkeráv2.4fá(c)á91/92/93á$#%!
  433. lexical analysing ...
  434. parsing and compiling ...
  435. no errors
  436. E:>  helloworld
  437. Hello, World!
  438. E:>  list
  439. HelloWorld.e                  89 ----rwed Oggi      17:37:00
  440. helloworld                   656 ----rwed Oggi      17:37:00
  441. 2 files - 4 blocks used
  442. E:>
  443.  
  444. note: the compiler cannot be made resident
  445.  
  446. Last note on compiling the examples: if a program uses module files
  447. for library definitions like:
  448.  
  449. MODULE 'GadTools', 'Reqtools'
  450.  
  451. the compiler needs to know where to find them. Two possible solutions:
  452. 1. you make the assignment "emodules:" to the modules directory (best).
  453. 2. you state in the source code where to look for modules, like:
  454.    OPT DIR='dh0:src/e/modules'
  455.  
  456. Options.
  457. These are standard AmigaDos options. You can see them at any time by typing
  458. 'EC ?'. For 1.2 options the old unix-like switches are used (need to be
  459. written together, preceded by a "-"):
  460.  
  461. LARGE        -l    compiles with large code/data model (see 16A, OPT LARGE).
  462. ASM        -a    puts EC into assembler mode (see 15D, OPT ASM).
  463. NOWARN        -n    suppresses warnings (see 16A, OPT NOWARN)
  464. SYM        -s    adds a symbolhunk to the executable, for use with
  465.             profilers, debuggers, disassemblers etc.
  466. LINEDEBUG    -L    adds a "LINE" debughunk to the executable, for use
  467.             with profilers, debuggers etc. (see 17K).
  468. REG=N        -rN    uses N regs per PROC for register-allocation.
  469.             (default is 0 for the time being, read elsewhere
  470.             about how to use this!)
  471. QUIET        -q    if there are no errors or warnings, EC won't output
  472.             anything.
  473. WB        -w    puts wb to front (for scripts)
  474. SHOWBUF        -b    shows buffer memory usage information
  475. ADDBUF=X    -mX    forces EC to allocate more memory for its buffers.
  476.             X ranges 1..9, the minimum number of 100k blocks to allocate.
  477.                 default is 1 (never needed).
  478. ERRLINE        -e    give the line# the error was on as returnvalue
  479. ERRBYTE        -E    give the byte-offset in the file the error was on
  480.             as returnvalue
  481. IGNORECACHE    -c    don't use the module-cache in any way
  482. HOLD        -h    wait for a <return> on the commandline before
  483.             exiting EC.
  484. OPTI            enable all optimisations (currently equals REG=5)
  485. DEBUG            attach debug infos to executable/module (see 17K)
  486.  
  487. example:  ec large blabla
  488. compiles blabla.e with large model.
  489. NOTE: in most standard cases you won't need to use any of these options
  490.  
  491.  
  492. 0E. changes from v2.1b to v3.0a, and from v3.0a to v3.1a
  493. --------------------------------------------------------
  494.  
  495. What's new in v3.0a (for v3.1a, see further below):
  496. [separated in four sections. for the description of these refer to the
  497.  actual chapter]
  498.  
  499. 1. BIG NEW FEATURES.
  500.  
  501. - compilation to modules [!] (see 10C)
  502. - oo: object inheritance, private/public, methods etc. (see 14A)
  503. - default arguments for PROCs (see 6F) (and some builtins, too).
  504. - multiple return values (see 6G)
  505. - register variables / allocation (see 16G, 15E, ...).
  506. - builtin REALs (see 12)
  507. - NEW operator (see 4K), and END (see 5M) (with superfast memory manegement)
  508. - powerful syntactic variation of SELECT (see 5J)
  509. - unification (see 4L)
  510. - allows for more complex types in OBJECTs, PTR TO <type> etc. (see 8F)
  511.   together with more powerful dereferencing (see 4F, x.y[a].z etc.)
  512. - garbage collected Lisp-Cells (see 9I)
  513. - function values (call ptrs to PROCs) (see 6H)
  514. - module caching (see 17D, showcache)
  515. - error reconstruction: pinpoint error at exact spot in line
  516. - whole bunch of new builtin functions (see 9A,...)
  517. - whole bunch of useful modules (will get loads more soon)
  518. - various compiler optimisations to make EC significantly faster
  519. - several code optimisations
  520. - intelligent linker / module system (see 10C, amongst others)
  521. - compiler uses a lot less memory.
  522. - symbol and linedebug hunks (see 0D above for switches).
  523. - various utilities, such as EE (Barry Wills great E Editor),
  524.   Build (a make), o2m (converts assembly .o files to modules), E-Yacc etc.
  525. - new docs, GREAT tutorial by Jason Hulance (known as 'The Guide').
  526.  
  527. 2. SMALLER NEW FEATURES.
  528.  
  529. - pointertyping "::" operator (see 4M)
  530. - EXCEPT DO: continue at handler (see 13C)
  531. - EXIT <boolexp> in WHILE/FOR (see 5F)
  532. - single line comments (see 1B)
  533. - for some: os v39 modules.
  534. - character constants may contain "\n\t\e\a" "\0\\\b\q" now. (\q = ")
  535. - warning for flakey "assignments" now with linenum.
  536. - dereferencing a PTR TO <object> with a just a [] results
  537.   in a pointer now (for example x[1] = next object)
  538. - variety of smaller code-optimisations.
  539. - a lot of string/list/io functions now return useful returnvalues (see 9A,...).
  540. - EC's command line is now ReadArgs() style for 2.04+ users (see 0D).
  541. - better line-endings (see 5A)
  542. - several new builtins (see 9A,...)
  543. - expressions with *2 *4 /2 and /4 get optimized into adds and shifts.
  544.  
  545. 3. BUGS / PROBLEMS FIXED.
  546.  
  547. - recognises '.e' also on the command line.
  548. - various bugs fixed (and new ones introduced, obviously)
  549. - now also a 'stdin' variable is available
  550. - dereferencing a PTR TO INT with [] would result in an unsigned
  551.   integer instead of a signed one (NOTE: this may change behaviour!)
  552. - EC could crash on missing ENDIFs: fixed.
  553. - CHAR would align incorrectly.
  554. - RAISE accepts negative constants.
  555. - Div() didn't handle negative numbers.
  556. - inline asm bugs: ADD.L ...,Ax became ADDX, various silly little problems.
  557. - StringF documentation was missing, InStr() incorrect.
  558. - SIZEOF handles CHAR/INT/LONG now too
  559. - WaitIMessage() did something silly
  560. - EC wouldn't consume some very large sources (>500k)
  561. - a WHILE or a UNTIL with an IF-exp as boolean could generate wrong code.
  562. - [exp]:CHAR would generate wrong code
  563. - some syntactical bugs could previously go unnoticed
  564. - console would open in READWRITE mode
  565.  
  566. 4. OTHER CHANGES ONE NEEDS TO BE AWARE OF.
  567.  
  568. - v2.1b "-s" option deleted.
  569. - 'OPT' now needs to be first thing in a source; other constructs
  570.   (like 'CONST', 'RAISE') have stricter checking on their position
  571.   in a source.
  572. - EC may generate 'internal errors' for some cases. If this
  573.   happens, report, with source what cause it.
  574. - keyword "IS" is equivalent to "RETURN" directly after a "PROC"
  575. - The inline-assembly register conventions have changed (see 15B)
  576.  
  577.  
  578.  
  579. Changes from v3.0a to v3.1a:
  580.  
  581.  
  582. Bugs fixed in v3.0b (nearly all were tiny problems, with great consequences!)
  583. - internal errors on 68000 systems
  584. - problems with inherited methods
  585. - modules could have 4 superfluous bytes of code in them
  586. - default arguments in modules could get lost
  587. - method redefinition could cause double declaration errors
  588. - ptr's to <object> in objects in modules would get lost [now ec will
  589.   try to find the correct object, else type = LONG]
  590.  
  591. Bugs fixed in v3.0e:
  592. - huge bug: linker wouldn't link modules >32k
  593. - enforcer hit in linker
  594. - String() could trash a register
  595. - errors within an OBJECT were reported on the first line
  596. - wrong code generated for AND.L Dn,regvar and similar instructions
  597. - .B size on An eas wasn't detected for various instructions
  598. - methods could be defined outside of object/module scope
  599. - object declarations could start as private for no reason
  600.  
  601.  
  602. New features in v3.1a:
  603. - SourceLevel debugging!!! option DEBUG/S and external debugger EDBG (see 17k)
  604. - Built-in preprocessor!!! (conditional compilation & macro preprocessing),
  605.   Mac2E and Cpp compatible (see 17L)
  606. - The SUPER keyword allows calling of superclass methods (see 14E)
  607. - Some new example sources, new tool modules (FilledVector, EasyGUI etc.)
  608. - new versions of Aprof and EE
  609. - docs updated: new features, FAQ etc...
  610.  
  611. Bugs fixed in v3.1a:
  612. - obj.unknownmember could give weird error reports
  613. - ShowModule could display arguments wrong
  614. - Lists [] didn't accept negative floating point numbers
  615. - small problems in E module definitions fixed
  616. - E-Build executed actions in reverse order :-)
  617. - FlushCache wouldn't allow a selective flush
  618. - Unification on complex nested LISP-lists could fail
  619. - NEW-allocated list deallocation routine was missing (see 9F)
  620. - missing closing brackets could cause fuzzy error messages
  621. - some constructions of nested method-calls and NEW with constructors
  622.   could result in wrong code
  623. - Both RealF() and RealVal() contained bugs that could give wrong results
  624.   on machines without a FPU
  625. - in some situations method names could clash with members in other modules
  626.  
  627.  
  628. Hint for users of older versions: do a diff over both versions of reference.doc
  629.  
  630.  
  631. 0F. additional information
  632. --------------------------
  633.  
  634. The Amiga E Compiler was developed over the course of more than three and a
  635. half years, after the author's idea of a good programming language, and
  636. a quality amiga-specific compiler for it. It was programmed (as you might
  637. have guessed) in 100% assembly, using the AsmOne assembler v1.02. All other
  638. support programs were written in E itself.
  639.  
  640. Special thanks go to the following people:
  641.  
  642. Barry Wills - for being the best best betatester ever.
  643. Jason Hulance - for his work on 'The Beginners Guide', and betatesting.
  644. Rob Verver - for comments/inspiration.
  645.  
  646. I also would like to thank the following people for various reasons
  647. (no particular order):
  648.  
  649. Raymond Hoving, Erwin van Breemen, Michael Zuchhi, James Cooper, Jens Gelhar,
  650. Paolo Silvera, Sergio Ruocco, Jeroen Vermeulen, Jan van den Baard, Joerg Wach,
  651. Norman Kraft, Urban Mueller, Charles McCreary, Olivier Anh, Lionel Vintenat,
  652. Rob Nottage, and many more...
  653.  
  654. This compiler was programmed with great care towards reliability, and
  655. even more so the code it generates, additionally it has been tested and
  656. debugged for a long period. However, it is not impossible that it contains
  657. bugs. if you happen to find one, or have other comments/questions,
  658. write me at the address below: I _strongly_ prefer E-mail above
  659. conventional mail.
  660.  
  661. NOTE WELL: due to the immense popularity of the previous version of
  662. Amiga E, I get an almost unreplyable amount of Email, some of which
  663. (>90%) are questions that would not have been necessary if people
  664. read all the docs carefully. What I mean to say is that I like
  665. to receive Email, and I don't mind answering questions and helping
  666. people out with programming problems, but be sure to check all other
  667. information at your disposal (like the Amiga E docs or the RKRM's) to
  668. see if your question is relevant, before mailing me. Especially
  669. questions that are not E specific but Amiga specific should not be
  670. directed to me. And try and be gentle on me with comments like "I
  671. think E should have feature X..." (see 18D, the FAQ)
  672.  
  673. registrations (see 0C) and donations are welcome at the following address:
  674.  
  675.     Wouter van Oortmerssen
  676.     Levendaal 87
  677.     2311 JG  Leiden
  678.     HOLLAND
  679.  
  680. or better if you have access to Email:
  681.  
  682.     wouter@mars.let.uva.nl
  683.     wouter@alf.let.uva.nl        (if mars bounces)
  684.  
  685.  
  686. +---------------------------------------------------------------+
  687. |                           1. FORMAT                |
  688. +---------------------------------------------------------------+
  689.  
  690. 1A. tabs,lf etc.
  691. ----------------
  692. E-sources are pure ascii format files, with the linefeed <lf> and
  693. semicolon ";" being the separators for two statements. Statements
  694. that have particularly many arguments, may be spread over several lines
  695. by ending a line with a comma (or any other lexical element that can
  696. normally never occur at the end of a line), thus ignoring the following
  697. <lf> (see 5A for line endings). Any lexical element in a source code
  698. file may be separated from another by any number of spaces, tabs etc.
  699.  
  700.  
  701. 1B. comments
  702. ------------
  703. comments may be placed anywhere in a source file where normally a space
  704. would have been correct. They start with '/*' and end with '*/'
  705. and may be nested infinitely. The same goes for one-line comments,
  706. which start with a '->' and end at the first <lf>.
  707.  
  708. /* this, is a comment */
  709. -> this one too.
  710.  
  711.  
  712. 1C. identifiers and types
  713. -------------------------
  714. identifiers are strings that the programmer uses to denote certain
  715. objects, in most cases variables, or even keywords or function names
  716. predefined by the compiler. An identifier may consist of:
  717.  
  718. - upper and lowercase characters
  719. - "0" .. "9" (except as first character)
  720. - "_" (the underscore)
  721.  
  722. All characters are significant, but the compiler just looks at the
  723. first two to identify the type of identifier it is dealing with:
  724.  
  725. both uppercase:               - keyword like IF, PROC etc.
  726.                               - constant, like MAX_LENGTH
  727.                               - assembly mnemonic, like MOVE
  728. first lowercase:              - identifier of variable/label/object etc.
  729. first upper and second lower: - E system function like: WriteF()
  730.                               - library call: OpenWindow()
  731.  
  732. Note that all identifiers obey this syntax, for example:
  733. WBenchToFront() becomes WbenchToFront()
  734.  
  735.  
  736. +---------------------------------------------------------------+
  737. |                      2. IMMEDIATE VALUES            |
  738. +---------------------------------------------------------------+
  739.  
  740. Immediate values in E all evaluate to a 32bit result; the only
  741. difference among these values (A-G) is either their internal
  742. representation, or the fact that they return a pointer rather than
  743. a value.
  744.  
  745. 2A. decimal (1)
  746. ---------------
  747. A decimal value is a sequence of characters "0" .. "9", possibly
  748. preceded by a minus "-" sign to denote negative numbers.
  749. examples: 1, 100, -12, 1024
  750.  
  751. 2B. hexadecimal ($1)
  752. --------------------
  753. A hexadecimal value uses the additional characters "A" .. "F" (or
  754. "a" .. "f") and is preceded by a "$" character.
  755. Examples: $FC, $DFF180, -$ABCD
  756.  
  757. 2C. binary (%1)
  758. ---------------
  759. Binary numbers start with a "%" character and use only "1" and "0"
  760. to form a value.
  761. Examples: %111, %1010100001, -%10101
  762.  
  763. 2D. float (1.0)
  764. ---------------
  765. Floats differ only from normal decimal numbers in that they have
  766. a "." to separate their two parts. Either one may be omitted,
  767. not both. Note that floats have a different internal 32bit (IEEE)
  768. representation (see 12A for more information on floats).
  769. Examples: 3.14159, .1 (=0.1), 1. (=1.0)
  770.  
  771. 2E. character
  772. -------------------
  773. The value of a character (enclosed in double "" quotes) is its
  774. ascii value, i.e. "A" = 65. In E, character immediate values
  775. may be a short string up to 4 characters, for example "FORM",
  776. where the first character "F" will be the MSB of the 32bit
  777. representation, and "M" the LSB (least significant byte).
  778.  
  779. 2F. string ('bla')
  780. ------------------
  781. Strings are any ascii representation, enclosed in single '' quotes.
  782. The value of such a string is a pointer to the first character of it.
  783. More specific: 'bla' yields a 32bit pointer to a memory area where
  784. we find the bytes "b", "l" and "a". ALL strings in E are terminated
  785. by a zero byte.
  786. Strings may contain format signs introduced by a slash "\", either
  787. to introduce characters to the string that are for some reason
  788. not displayable, or for use with string formatting functions
  789. like WriteF(), TextF() and StringF(), or kick2 Vprintf().
  790.  
  791. \n        a linefeed (ascii 10)
  792. \a or ''    an apostrophe ' (the one used for enclosing the string)
  793. \q        a doublequote: "
  794. \e        escape (ascii 27)
  795. \t        tab (ascii 9)
  796. \\        a backslash
  797. \0        a zero byte. Of rare use, as ALL strings are 0-terminated
  798. \b        a carriage return (ascii 13)
  799.  
  800. Additionally, when used with formatting functions:
  801.  
  802. \d    print a decimal number
  803. \h    print a hexadecimal
  804. \s    print a string
  805. \c    print a character
  806. \z    set fill byte to '0' character
  807. \l    format to left of field
  808. \r    format to right of field (these last two act as toggles)
  809.  
  810. Field specifiers may follow the \d,\h and \s codes:
  811.  
  812. [x]    specify exact field width x
  813. (x,y)    specify minimum x and maximum y (strings only)
  814.  
  815. Example: print a hexadecimal number with 8 positions and leading zeroes:
  816. WriteF('\z\h[8]\n',num)
  817.  
  818. A string may be extended over several lines by trailing them with a "+"
  819. sign and a <lf>:
  820.  
  821. 'this specifically long string ' +
  822. 'is separated over two lines'
  823.  
  824.  
  825. 2G. lists ([1,2,3]) and typed lists
  826. -----------------------------------
  827. An immediate list is the constant counterpart of the LIST datatype,
  828. just as a 'string' is the constant counterpart for the STRING or
  829. ARRAY OF CHAR datatype. Example:
  830.  
  831. [3,2,1,4]
  832.  
  833. is an expression that has as value a PTR to an already initialised list,
  834. a list as a representation in memory is compatible with an ARRAY OF LONG,
  835. with some extra length information at a negative offset. You may use these
  836. immediate lists anywhere a function expects a PTR to an array of
  837. 32bits values, or a list. Examples:
  838.  
  839. ['string',1.0,2.1]
  840. [WA_FLAGS,1,WA_IDCMP,$200,WA_WIDTH,120,WA_HEIGHT,150,TAG_DONE]
  841.  
  842. (see 9C on list-functions for a discussion on typed-immediate
  843. lists and detailed information).
  844.  
  845.  
  846. 2H. lisp-cells (<a|b>)
  847. ----------------------
  848. (see 9I to read about cells in detail)
  849.  
  850.  
  851. +---------------------------------------------------------------+
  852. |                         3. EXPRESSIONS             |
  853. +---------------------------------------------------------------+
  854.  
  855. 3A. format
  856. ----------
  857. An expression is a piece of code held together by operators, functions
  858. and parentheses to form a value.
  859. They mostly consist of:
  860.  
  861. - immediate values (see 2A,...)
  862. - operators (see 4A,...)
  863. - function calls (see 3D)
  864. - parentheses () (see 3B)
  865. - variables or variable-expressions (see 3C)
  866.  
  867. examples of expressions:
  868. 1
  869. 'hello'
  870. $ABCD+(2*6)+Abs(a)
  871. (a<1) OR (b>=100)
  872.  
  873. 3B. precedence and grouping
  874. ---------------------------
  875. The E language has _no_ precedence whatsoever. This means that
  876. expressions are evaluated left to right. You may change
  877. precedence by parenthesizing some (sub-)expression:
  878. 1+2*3 /* =9 */     1+(2*3) /* =7 */       2*3+1  /* =7 */
  879.  
  880. 3C. types of expressions
  881. ------------------------
  882. There are three types of expressions that may be used for different
  883. purposes;
  884.  
  885. - <var>, consisting of just a variable
  886. - <varexp>, consisting of a variable, possibly with unary operators
  887.   with it, like "++" (increment) "." (member selection) or [] (array
  888.   operator). (see 4D, 4G). It denotes a modifiable expression, like
  889.   Lvalues in C.
  890.   Note that those (unary) operators are not part of any precedence.
  891. - <exp>. This includes <var> and <varexp>, and any other expression.
  892.  
  893. 3D. function calls
  894. ------------------
  895. A function call is a temporary suspension of the current code for a
  896. jump to a function, this may be either a self-written function (PROC),
  897. or a function provided by the system. The format of a function call
  898. is the name of the function, followed by two parentheses () enclosing
  899. zero to unlimited arguments, separated by commas ",". Note that arguments
  900. to functions are again expressions. (see 6A) on how to make your own
  901. functions, (see 9A and 10A)
  902. on built-in functions. Examples:
  903.  
  904. foo(1,2)
  905. Gadget(buffer,glist,2,0,40,80+offset,100,'Cancel')
  906. Close(handle)
  907.  
  908.  
  909. +---------------------------------------------------------------+
  910. |                          4. OPERATORS                |
  911. +---------------------------------------------------------------+
  912.  
  913. 4A. math (+ - * /)
  914. ------------------
  915. These infix operators combine an expression with another value
  916. to yield a new value. Examples:
  917.  
  918. 1+2, MAX-1*5
  919.  
  920. (see 12A on how to overload these operators for use with floats).
  921. "-" may be used as the first part of an expression, with an implied 0,
  922. i.e.    -a    or    -b+1      is legal.
  923. Note that * and / are by default 16bit operators: (see 9G, Mul())
  924.  
  925. 4B. comparison (= <> > < >= <=)
  926. -------------------------------
  927. Equal to math operators, with the difference that they result in either
  928. TRUE (32bit value -1), or FALSE. These can also be overloaded for floats.
  929.  
  930. 4C. logical and bitwise (AND OR)
  931. --------------------------------
  932. These operators either combine truth values to new ones, or perform
  933. bitwise AND and OR operations. Examples:
  934. (a>1) AND ((b=2) OR (c>=3))         /* logical */
  935. a:=b AND $FF                        /* bitwise */
  936.  
  937. 4D. unary (SIZEOF ^ {} ++ -- `)
  938. ---------------------------------
  939. - SIZEOF <objectident>
  940.   simply returns the size of a certain object or CHAR/INT/LONG.
  941.   Example: SIZEOF newscreen + SIZEOF INT
  942. - {<var>}
  943.   Returns the address of a variable or label. This is the operator
  944.   you would use to give a variable as argument to a function by
  945.   reference, instead of by value, which is default in E. See "^".
  946.   Example:  Val(input,{x})
  947. - ^<var>
  948.   The counterpart of {}, writes or reads variables that were given by
  949.   reference, examples:      ^a:=1     b:=^a
  950.   it may also be used to plainly "peek" or "poke" LONG values from
  951.   memory, if <var> is pointer to such a value.
  952.   Example for {} and ^: write your own assignment function;
  953.  
  954.   PROC set(var,exp)
  955.     ^var:=exp
  956.   ENDPROC
  957.  
  958.   and call it with:     set({a},1)     /* equals a:=1 */
  959. - <varexp>++   and  <varexp>--
  960.   Increases (++) or decreases (--) the pointer that is denoted by
  961.   <varexp> by the size of the data it points to. This has the effect
  962.   that that pointer points to the next or previous item. When used
  963.   on variables that are not pointers, these will simply be changed
  964.   by one. Note that ++ always takes effect _after_ the calculation
  965.   of <varexp>, -- always _before_. Examples:
  966.  
  967.   a++          /* return value of a, then increase by one */
  968.   sp[]--       /* decrease pointer sp by 4 (if it were an array of long),
  969.                   and read value pointed at by sp */
  970. - `<exp>
  971.   This is called a quoted expression, from LISP. <exp> is not evaluated,
  972.   but instead returns the address of the expression, which can later be
  973.   evaluated when required. More on this special feature in chapter 11
  974.  
  975. 4E. triple (IF THEN ELSE)
  976. -------------------------
  977. The IF operator has quite the same function as the IF statement, only
  978. it selects between two expressions instead of two statements or blocks
  979. of statements. It equals the x?y:z operator in C.
  980.  
  981. IF <boolexp> THEN <exp1> ELSE <exp2>
  982.  
  983. returns exp1 or exp2, according to boolexp. For example, instead of:
  984.  
  985. IF a<1 THEN b:=2 ELSE b:=3
  986. IF x=3 THEN WriteF('x is 3\n') ELSE WriteF('x is something else\n')
  987.  
  988. write:
  989.  
  990. b:=IF a<1 THEN 2 ELSE 3
  991. WriteF(IF x=3 THEN 'x is 3\n' ELSE 'x is something else\n')
  992.  
  993. 4F. structure (.)
  994. -----------------
  995. <ptr2object>.<memberofobject> builds a <varexp>
  996. The pointer has to be declared as PTR TO <object> or ARRAY OF <object>
  997. (see 8D for these), and the member has to be a legal
  998. object identifier. Note that reading a subobject in an object this
  999. way results in a pointer to that object. Examples:
  1000.  
  1001. thistask.userdata:=1
  1002. rast:=myscreen.rastport
  1003.  
  1004. If the member you select is of type PTR TO <type>, you may use "."
  1005. and "[]" to dereference further values. If you select an ARRAY or
  1006. substructure in an OBJECT, the result is again a PTR.
  1007.  
  1008. 4G. array ([])
  1009. --------------
  1010. <var>[<indexexp>] (is a <varexp>)
  1011. This operator reads the value from the array <var> points to, with
  1012. index <indexexp>. The index may be just about any expression.
  1013. Note1: "[]" is a shortcut for "[0]"
  1014. Note2: with an array of n elements, the index is  0 .. n-1
  1015. Examples:
  1016.  
  1017. a[1]:=10           /* sets second element to 10 */
  1018. x:=table[y*4+1]    /* reads from array */
  1019. x.y[3]             /* accesses array in an object */
  1020.  
  1021. 4H. float operator (!)
  1022. ----------------------
  1023. <exp>!<exp>
  1024. Converts expressions from integer to float and back, and
  1025. overloads operators + - * / = <> < > <= >= with float equivalents.
  1026. (see 12A to read all about floats and this operator).
  1027.  
  1028. 4I. assignments expressions (:=)
  1029. --------------------------------
  1030. Assignments (setting a variable to a value) exist as statement
  1031. and as expression. The only difference is that the statement
  1032. version has the form <varexp>:=<exp> and the expression <var>:=<exp>.
  1033. The latter has the value of <exp> as result.
  1034. Note that as <var>:= takes on an expression, you will often need
  1035. parentheses to force correct interpretation, like:
  1036.  
  1037. IF mem:=New(100)=NIL THEN error()
  1038.  
  1039. is interpreted like:
  1040.  
  1041. IF mem:=(New(100)=NIL) THEN error()
  1042.  
  1043. which is not what you mean: mem should be a pointer, not a boolean.
  1044. but you should write:
  1045.  
  1046. IF (mem:=New(100))=NIL THEN error()
  1047.  
  1048. it's a good habit to parenthesize any assignment expression that is
  1049. part of another one, if not already disambiguated by other constructs
  1050. such as "bla(a:=1)", "b:=a:=1" etc.
  1051.  
  1052. 4J. sequencing (BUT)
  1053. --------------------
  1054. The sequencing operator "BUT" allows two expressions to be written
  1055. in a construction that allows for only one. Often in writing
  1056. complex expressions/function calls, one would like to do a second
  1057. thing on the spot, like an assignment. Syntax:
  1058.  
  1059. <exp1> BUT <exp1>
  1060.  
  1061. this says: evaluate exp1, but return the value of exp2.
  1062. Example:
  1063.  
  1064. myfunc((x:=2) BUT x*x)
  1065.  
  1066. assign 2 to x and then calls myfunc with x*x. The () around the
  1067. assignment are again needed to prevent the := operator from taking
  1068. (2 BUT x*x) as an expression.
  1069.  
  1070. 4K. dynamic memory allocation (NEW)
  1071. -----------------------------------
  1072. the NEW operator is a powerful operator for dynamic memory allocation.
  1073. it has various forms:
  1074.  
  1075. (assuming DEF p:PTR TO whateverobj, q:PTR TO INT)
  1076.  
  1077. NEW p
  1078.  
  1079. is an expression that will allocate zero-ised memory for the object-size
  1080. p points to. the resulting pointer will be put in p, and is also
  1081. the value of the expression. if NEW fails to get memory, it raises
  1082. a "NEW" exception. 'NEW p' is therefore roughly equivalent with:
  1083.  
  1084. IF (p:=New(SIZEOF whateverobj))=NIL THEN Raise("MEM")
  1085.  
  1086. with the difference that p never gets any value if an exception
  1087. is raised, and that the former is of course an expression, not
  1088. a statement
  1089.  
  1090. but there's more: one can also allocate an array dynamically:
  1091.  
  1092. NEW p[10]       /* array of 10 objects */
  1093.  
  1094. NEW q[a+1]      /* array of INT, size is runtime computed */
  1095.  
  1096. (this doesn't work when instantiating classes)
  1097. A problem with list [1,2,3] expressions sometimes is that they are static,
  1098. and when using these to build large datastructures they would need to be
  1099. created at run-time. one may then use the dynamic equivalent to static
  1100. lists:
  1101.  
  1102. p:=[1,2,3]:whateverobj           /* static structure */
  1103.  
  1104. p:=NEW [1,2,3]:whateverobj       /* dynamicly allocated! */
  1105.  
  1106. this works with both lists and typed-lists, and also with arrays:
  1107.  
  1108. NEW [1,2,3]        /* constant-list, dyn. (note: not a like a listvar!) */
  1109. NEW [1,2,3]:obj    /* object */
  1110. NEW [1,2,3]:INT    /* array of INTs */
  1111.  
  1112. freeing memory allocated with any variations of NEW is done automatically
  1113. at the end of the program, or by hand with END or FastDispose().
  1114. (note: the only exception is NEW <list>, use FastDisposeList())
  1115.  
  1116. If you use NEW [...]:obj, and the number of fields is less than the
  1117. one present in the object, additional 0/NIL/"\0" whatever fields will
  1118. be added. this allows one to extend objects without getting into
  1119. trouble with allocations like these. (note that this is different
  1120. from the static [...]:obj)
  1121.  
  1122. when you use NEW as a statement, multiple pointers may follow, i.e.:
  1123.  
  1124.     NEW a,b.create(),c
  1125.  
  1126. is valid.
  1127. (see 5M, END)
  1128. (see 9F for the fast memory allocation functions NEW makes use of)
  1129.  
  1130. 4L. unification (<=>)
  1131. ---------------------
  1132. Unification allows a totally different style of programming
  1133. that will be familiar to you if you're used to either Logic
  1134. (ProLog), equational or functional (Miranda/Gofer/Haskell)
  1135. programming. Most of us when using structures/arrays whatever
  1136. are used to get values from it by selection ("." and "[]"),
  1137. in these languages however pattern matching is used.
  1138.  
  1139. in E:
  1140.  
  1141. exp <=> uni_exp
  1142.  
  1143. exp can be any expression, but in v3 it's only really useful
  1144. if it somehow is a pointer to a list. uni_exp is the pattern
  1145. that is used to match exp. All constants in uni_exp much
  1146. match to values in exp, variables are set to their respective
  1147. values. if something doesn't match, no variables get a value,
  1148. and the expression has the result FALSE. otherwise TRUE.
  1149. example:
  1150.  
  1151. a:=[1,2,3]
  1152. ...
  1153. IF a <=> [1,x,y] THEN ...
  1154.  
  1155. this will succeed with x=2 and y=3. If list a were to be another
  1156. lenght than 3, the match would fail too. The fact that a is a list
  1157. in the first place is something you need to assure by yourself, EC
  1158. simply tries to fit the uni_exp on whatever value it gets as exp.
  1159. examples of FALSE:
  1160.  
  1161. a <=> [1,x]        -> wrong list-len
  1162. a <=> [1,4,x]        -> 4=2 fails
  1163. 'bla' <=> [1,2]        -> unpredictable result / crash ?
  1164.  
  1165. The fun thing with unification is that you can do very complex matches,
  1166. and that if you take the first field or so as a constant telling what the
  1167. structure is, you have a nice form of dynamic typing. And, all the time
  1168. without using PTRs!
  1169.  
  1170. a slightly nicer example:
  1171.  
  1172. [BLA,[1,'burp'],['bla',"bla"]] <=> [BLA,[1,x],y]
  1173.  
  1174. binds:
  1175.  
  1176. x='burp', y=['bla',"bla"]
  1177.  
  1178. or even:
  1179.  
  1180. IF myexp <=> [PLUS,[MUL,a,1],[SUBS,[PLUS,c,d],e]] THEN RETURN a+c+d-e
  1181.  
  1182. maybe a silly example, but one could imagine doing complex stuff
  1183. like this in a compiler's code-optimizer. it equals this traditional code:
  1184.  
  1185. IF ListLen(myexp)=3
  1186.   IF myexp[]=PLUS
  1187.     IF ListLen(dummy:=myexp[1])=3
  1188.       IF (dummy[]=MUL) AND (dummy[2]=1)
  1189.         a:=dummy[1]
  1190.         IF ListLen(dummy:=myexp[2])=3
  1191.           IF dummy[]=SUBS
  1192.             e:=dummy[2]
  1193.             IF ListLen(dummy2:=dummy[1])=3
  1194.               IF dummy2[]=PLUS
  1195.                 c:=dummy2[1]
  1196.                 d:=dummy2[2]
  1197.                 RETURN a+c+d-e
  1198.               ENDIF
  1199.             ENDIF
  1200.           ENDIF
  1201.         ENDIF
  1202.       ENDIF
  1203.     ENDIF
  1204.   ENDIF
  1205. ENDIF
  1206.  
  1207. only then a bit more optimal. As you see there's a lot of expressive
  1208. power involved in unification as compared to traditional selection-based
  1209. programming.
  1210.  
  1211. For now, the only thing allowed in unification are untyped lists,
  1212. (integer) constants, variables and LISP-Cells (see 9I for that).
  1213. The future will see this expanded with strings, typed-lists/objects,
  1214. and even expressions [!]
  1215.  
  1216.  
  1217. 4M. pointer typing (::)
  1218. -----------------------
  1219. when you write an expression like 'p' where p is a PTR TO object,
  1220. this allows you to dereference it as such. The pointer typing
  1221. operator allows you to change such a type on the fly:
  1222.  
  1223. DEF p:PTR TO mp            -> message port
  1224.  
  1225. p.sigbit            -> access it
  1226. p::ln.name            -> access pointer as if it were a node
  1227.  
  1228. this is very useful for pointers that can point to different sorts
  1229. of things or objects that are part of each other, where of course
  1230. only one declaration is possible.
  1231.  
  1232. A second handy use is in OBJECTs that have members declared as LONG,
  1233. which are actually pointers. You may type it on the fly to dereference
  1234. it anyway:
  1235.  
  1236. mywindow.userport::mp.sigbit
  1237.  
  1238. here the window OBJECT has userport defined as LONG, so you wouldn't
  1239. be able to dereference it normally.
  1240.  
  1241.  
  1242. +---------------------------------------------------------------+
  1243. |                          5. STATEMENTS            |
  1244. +---------------------------------------------------------------+
  1245.  
  1246.  
  1247. 5A. format (;)
  1248. --------------
  1249. As suggested in chapter 1A, a statement generally stands in its
  1250. own line, but several of them may be put together on one line
  1251. by separating them with semicolon, or one may be spread over
  1252. more than one line by ending each line in a comma ",". Examples:
  1253.  
  1254. a:=1; WriteF('hello!\n')
  1255. DEF a,b,c,d,                      /* too many args for one line (faked) */
  1256.     e,f,g
  1257.  
  1258. statements may be:
  1259. - assignments
  1260. - conditional statements, for statements and the like, (see 5E-5K)
  1261. - void expressions
  1262. - labels
  1263. - assembly instructions
  1264.  
  1265. The comma is the primary character to show that you do not wish to
  1266. end the statement with the next linefeed, but from v3 on, any token
  1267. that cannot legally be the end of a line causes the statement to
  1268. continue. Furthermore, if not all "[" and "(" occuring in a statement
  1269. have been closed off, a statement will continue also.
  1270. examples of such tokens:
  1271.  
  1272. + - * / =
  1273. < >= <=
  1274. := . <=> ::
  1275. { [ (
  1276. AND OR BUT THEN IS        -> others too, but these are most useful
  1277.  
  1278. example of bracketing:
  1279.  
  1280. a:=[
  1281.     [1,2],
  1282.     [3,4]
  1283.    ]            -> assignment ends here.
  1284.  
  1285. 5B. statement labels and gotos (JUMP)
  1286. -------------------------------------
  1287. Labels are global-scoped identifiers with a ':' added to them, as in:
  1288.  
  1289. mylabel:
  1290.  
  1291. they may be used by instructions such as JUMP, and to reference
  1292. static data. They may be used to jump out of all types of loops (although
  1293. this technique is not encouraged, (see 5F, EXIT), but not out of
  1294. procedures. In normal E programs they are mostly used with inline assembly.
  1295. Labels are always globally visible.
  1296.  
  1297. Usage of JUMP:    JUMP <label>
  1298. continues execution at <label>. You are not encouraged to use this
  1299. instruction, it's there for situations that would otherwise increase
  1300. the complexity of the program. Example:
  1301.  
  1302. IF done THEN JUMP stopnow
  1303.  
  1304. /* other parts of program */
  1305.  
  1306. stopnow:
  1307.  
  1308. 5C. assignment (:=)
  1309. -------------------
  1310. The basic format of an assignment is:   <var> := <exp>
  1311. Examples: a:=1,  a:=myfunc(),  a:=b*3
  1312.  
  1313. In E one can assign multiple variables at once, when <exp> is
  1314. a function that returns multiple returnvalues. (see 6G)
  1315.  
  1316. 5D. assembly mnemonics
  1317. ----------------------
  1318. In E, inline assembly is a true part of the language, they need not
  1319. be enclosed in special "ASM" blocks or the like, as is usual in
  1320. other languages, nor are separate assemblers necessary to assemble
  1321. the code. This also means that it obeys the E syntax rules, etc.
  1322. (see 15A to read all about the inline assembler). Example:
  1323.  
  1324. DEF a,b
  1325. b:=2
  1326. MOVEQ  #1,D0             /* just use some assembly statements */
  1327. MOVE.L D0,a              /* a:=1+b  */
  1328. ADD.L  b,a
  1329. WriteF('a=\d\n',a)       /* a will be 3 */
  1330.  
  1331. 5E. conditional statement (IF)
  1332. ------------------------------
  1333. IF, THEN, ELSE, ELSEIF, ENDIF
  1334.  
  1335. syntax:        IF <exp> THEN <statement> [ ELSE <statement> ]
  1336. or:        IF <exp>
  1337.                   <statements>
  1338.         [ ELSEIF <exp>           /* multiple elseifs may occur */
  1339.                   <statements> ]
  1340.         [ ELSE ]
  1341.                   <statements>
  1342.         ENDIF
  1343.  
  1344. builds a conditional block. Note that there are two general forms of
  1345. this statement, a single-line and a multiple-line version.
  1346.  
  1347.  
  1348. 5F. for-statement (FOR)
  1349. -----------------------
  1350. FOR, TO, STEP, DO, ENDFOR
  1351.  
  1352. syntax:        FOR <var> := <exp> TO <exp> STEP <step> DO <statement>
  1353. or:        FOR <var> := <exp> TO <exp> STEP <step>
  1354.                   <statements>
  1355.         ENDFOR
  1356.  
  1357. builds a for-block, note the two general forms. <step> may be
  1358. any positive or negative constant, excluding 0, and is optional. Example:
  1359.  
  1360. FOR a:=1 TO 10 DO WriteF('\d\n',a)
  1361.  
  1362. The body of FOR may contain EXIT statements with the following syntax:
  1363.  
  1364. EXIT <boolexp>
  1365.  
  1366. Which allows you to exit the loop if boolexp is true.
  1367.  
  1368.  
  1369. 5G. while-statement (WHILE)
  1370. ---------------------------
  1371. WHILE, DO, ENDWHILE
  1372.  
  1373. syntax:        WHILE <exp> DO <statement>
  1374. or:        WHILE <exp>
  1375.                   <statements>
  1376.         ENDWHILE
  1377.  
  1378. builds a while-loop, which is repeated as long as <exp> is TRUE. Note
  1379. the one-line/one-statement version and the multiple line version.
  1380.  
  1381. WHILE may also contain EXIT statements, like FOR.
  1382.  
  1383.  
  1384. 5H. repeat-statement (REPEAT)
  1385. -----------------------------
  1386. REPEAT, UNTIL
  1387.  
  1388. syntax:        REPEAT
  1389.         UNTIL <exp>
  1390.  
  1391. builds a repeat-until block: it will continue to loop this block until
  1392. <exp>=TRUE. Example:
  1393.  
  1394. REPEAT
  1395.   WriteF('Do you really, really wish to exit this program?\n')
  1396.   ReadStr(stdout,s)
  1397. UNTIL StrCmp(s,'yes please!')
  1398.  
  1399.  
  1400. 5I. loop-statement (LOOP)
  1401. -------------------------
  1402. LOOP, ENDLOOP
  1403.  
  1404. syntax:        LOOP
  1405.           <statements>
  1406.         ENDLOOP
  1407.  
  1408. builds an infinite loop.
  1409.  
  1410.  
  1411. 5J. select-case-statement (SELECT)
  1412. ---------------------------------
  1413. SELECT, CASE, DEFAULT, ENDSELECT
  1414.  
  1415. syntax:        SELECT <var>
  1416.         [ CASE <exp>
  1417.           <statements> ]
  1418.         [ CASE <exp>
  1419.           <statements> ]   /* any number of these blocks */
  1420.         [ DEFAULT
  1421.           <statements> ]
  1422.         ENDSELECT
  1423.  
  1424. builds a select-case block. Various expressions will be matched against
  1425. the variable, and only the first matching block executed. If nothing matches,
  1426. a default block may be executed.
  1427.  
  1428. SELECT character
  1429.   CASE 10
  1430.     WriteF('Gee, I just found a linefeed\n')
  1431.   CASE 9
  1432.     WriteF('Wow, this must be a tab!\n')
  1433.   DEFAULT
  1434.     WriteF('Do you know this one: "\c" ?\n',character)
  1435. ENDSELECT
  1436.  
  1437. next to the old SELECT <var> which works on expressions in the CASE
  1438. statements, E has a SELECT <maxrange> OF <exp> which works with constants
  1439. and or ranges of constants in a CASE. not only is this for many applications
  1440. more powerful, it is also much faster for large numbers of cases (>5
  1441. usually), or if cases are equally probable. It assumes however, that all
  1442. CASEs lie within a small integer range from 0 TO n-1, where n is something
  1443. reasonable, for example 10, or 255 for characters.
  1444.  
  1445. example:
  1446.  
  1447. SELECT 127 OF FgetC(stream)
  1448.   CASE "\n","\b"
  1449.     WriteF('line ending\n')
  1450.   CASE "\t"," "
  1451.     WriteF('whitepace\n')
  1452.   CASE "0" TO "9"
  1453.     WriteF('Integer\n')
  1454.   CASE "A" TO "Z", "a" TO "z", "_"
  1455.     WriteF('Identifier\n')
  1456.   DEFAULT
  1457.     WriteF('some other character\n')
  1458. ENDSELECT
  1459.  
  1460. DEFAULT will be hit not only for those for which there is no CASE,
  1461. but also for the chars that fall out of the range, i.e. 128 TO 255
  1462. (and >255, and <0).
  1463. note that speed costs: because this SELECT uses a jump-table
  1464. to quickly get at the right CASE, it'll use 2*<maxrange> bytes,
  1465. 256 in this case.
  1466.  
  1467.  
  1468. 5K. increase statement (INC/DEC)
  1469. --------------------------------
  1470. INC, DEC
  1471.  
  1472. syntax:        INC <var>
  1473.         DEC <var>
  1474.  
  1475. short for <var>:=<var>+1 and <var>:=<var>-1. Only difference with
  1476. var++ and var-- is that these are statements, and do not return a value.
  1477.  
  1478.  
  1479. 5L. void expressions (VOID)
  1480. ---------------------------
  1481. VOID
  1482.  
  1483. syntax:        VOID <exp>
  1484.  
  1485. calculates the expression without the result going anywhere. Only useful
  1486. for a clearer syntax, as expressions may be used as statements without
  1487. VOID in E anyway. This may cause subtle bugs though, as "a:=1" assigns
  1488. a the value 1, but "a=1" as a statement will do nothing. E will give you
  1489. a warning if this happens.
  1490.  
  1491.  
  1492. 5M. memory deallocation (END)
  1493. -----------------------------
  1494. END is the complement to NEW. any pointer obtained should be
  1495. deallocated (and only!) with END
  1496.  
  1497.     END a
  1498.  
  1499. or even
  1500.  
  1501.     END a,b,c
  1502.  
  1503. where the arguments are PTRs to some type. END frees the amount of space
  1504. that is being pointed to, so if a is PTR TO LONG it will only free 4
  1505. bytes. so if you allocated a with NEW a[NUM], free it with
  1506.  
  1507.     END a[NUM]
  1508.  
  1509. NIL-pointers may safely be passed to NEW. Pointers are also
  1510. nuked to NIL afterwards.
  1511. If a is a PTR to an object that is an instance of a class, END
  1512. will dynamically get the size to be freed from the class-object,
  1513. so if you have an object of class b which is 32 bytes, but the
  1514. pointer you're freeing with is a baseclass pointer (only 24
  1515. bytes), END will correctly deallocate 32 bytes. this only works
  1516. for classes.
  1517.  
  1518. You can imagine END p as a macro for:
  1519.  
  1520.     IF p
  1521.       p.end()
  1522.       FastDispose(p,p.classobject.virtuallen)
  1523.       p:=NIL
  1524.     ENDIF
  1525.  
  1526. note that the NEW and END make use of the FastNew() and FastDispose()
  1527. functions (described elsewhere) which work quite differently from
  1528. NewR() and Dispose(). (see 9F for details).
  1529.  
  1530.  
  1531. +---------------------------------------------------------------+
  1532. |            6. FUNCTION DEFINITIONS AND DECLARATIONS        |
  1533. +---------------------------------------------------------------+
  1534.  
  1535. 6A. proc definition and arguments (PROC)
  1536. ----------------------------------------
  1537.  
  1538. You may use PROC and ENDPROC to collect statements into your own functions.
  1539. Such a function may have any number of arguments, and several return values.
  1540.  
  1541. PROC, ENDPROC
  1542.  
  1543. syntax:        PROC <label> ( <args> , ... )
  1544.         ENDPROC <returnvalue>, ...
  1545.  
  1546. defines a procedure with any number of arguments. Arguments are of type LONG
  1547. or optionally of type PTR TO <type> (see 8B) and need no further
  1548. declaration. The end of a procedure is designated by ENDPROC. If no
  1549. return value is given, 0 is returned. Example: write a function that
  1550. returns the sum of two arguments:
  1551.  
  1552. PROC add(x,y)         /* x and y are local variables */
  1553. ENDPROC x+y           /* return the result  */
  1554.  
  1555. a short version:
  1556.  
  1557. PROC add(x,y) IS x+y
  1558.  
  1559.  
  1560. 6B. local and global definitions: scope (DEF)
  1561. ---------------------------------------------
  1562. You may define additional local variables besides those which are
  1563. arguments with the DEF statement. The easiest way is simply like:
  1564.  
  1565. DEF a,b,c
  1566.  
  1567. declares the identifiers a, b and c as variables of your function.
  1568. Note that such declarations should be at the start of your function.
  1569.  
  1570. DEF
  1571.  
  1572. syntax:        DEF <declarations>,...
  1573.  
  1574. declares variables. A declaration has one of the forms:
  1575.  
  1576.         <var>
  1577.         <var>:<type>              where <type>=LONG,<objectident>,...
  1578.         <var>[<size>]:<type>      where <type>=ARRAY,STRING,LIST
  1579.  
  1580. (see 8A for more examples, as that is where the types are introduced).
  1581. For now, we'll use the <var> form.
  1582. Arguments to functions are restricted to basic types; (see 8B).
  1583. A declaration of a basic type can have an initialisation, in the current
  1584. version this must be an integer (not an expression):
  1585.  
  1586. DEF a=1,b=2
  1587.  
  1588. A program consists of a set of functions, called procedures, PROCs. Each
  1589. procedure may have Local variables, and the program as a whole may have
  1590. Global variables. At least one procedure should be the PROC main(), as
  1591. this is the module where execution begins. A simple program could look like:
  1592.  
  1593. DEF a, b                            /* definition of global vars */
  1594.  
  1595. PROC main()                         /* all functions in random order */
  1596.   bla(1)
  1597. ENDPROC
  1598.  
  1599. PROC bla(x)
  1600.   DEF y,z                           /* possibly with own local vars */
  1601. ENDPROC
  1602.  
  1603. To summarize, local definitions are the ones you make at the start of
  1604. procedures, and which are only visible within that function. Global
  1605. definitions are made before the first PROC, at the start of your
  1606. source code, and they are globally visible. Global and local variables
  1607. (and of course local variables of two different functions) may have the
  1608. same name, local variables always have priority.
  1609.  
  1610. 6C. endproc/return
  1611. ------------------
  1612. As stated before, ENDPROC marks the end of a function definition, and may
  1613. return a value. Optionally RETURN may be used at any point in the function
  1614. to exit, if used in main(), it will exit the program. (see 9F, CleanUp()).
  1615.  
  1616. RETURN [<returnvalue>]          /* optional */
  1617.  
  1618. Example:
  1619.  
  1620. PROC getresources()
  1621.   /* ... */
  1622.   IF error THEN RETURN FALSE  /* something went wrong, so exit and fail */
  1623.   /* ... */
  1624. ENDPROC TRUE   /* we got this far, so return TRUE */
  1625.  
  1626. a very short version of a function definition is:
  1627.  
  1628. PROC <label> ( <arg> , ... ) RETURN <exp>
  1629.  
  1630. (or "IS" instead of "RETURN")
  1631. These are function definitions that only make small computations, like
  1632. faculty functions and the like:  (one-liners :-)
  1633.  
  1634. PROC fac(n) IS IF n=1 THEN 1 ELSE fac(n-1)*n
  1635.  
  1636.  
  1637. 6D. the `main' function
  1638. -----------------------
  1639. The PROC called main is only of importance because it is called as first
  1640. function; it behaves exactly the same as other functions, and may also
  1641. have local variables. Main has no arguments: the command-line arguments
  1642. are supplied in the system-variable "arg", or can be checked with
  1643. ReadArgs() (dos.library function)
  1644.  
  1645. 6E. built-in system variables
  1646. ----------------------------
  1647. Following global variables are always available in you program,
  1648. they're called system variables.
  1649.  
  1650. arg        As discussed above, contains a pointer to a zero-terminated
  1651.         string, containing the command-line arguments. Don't use this
  1652.         variable if you wish to use ReadArgs() instead.
  1653. stdout        Contains a file-handle to the standard output (and input).
  1654.         If your program was started from the workbench, so no
  1655.         shell-output is available, WriteF() will open a
  1656.         CON: window for you and put its file handle here.
  1657. stdin        file-handle of standard input
  1658. conout        This is where that file handle is kept, and the console
  1659.         window will be automatically closed upon exit of your
  1660.         program. (see 9A, WriteF(), on how to use these two variables
  1661.         properly).
  1662. execbase,    These four variables are always provided with their
  1663. dosbase,    correct values.
  1664. gfxbase,
  1665. intuitionbase
  1666. stdrast        Pointer to standard rastport in use with your program,
  1667.         or NIL. The built-in graphics functions like Line()
  1668.         make use of this variable.
  1669. wbmessage    Contains a ptr to a message you got if you started
  1670.         from wb, else NIL. May be used as a boolean to detect
  1671.         if you started from workbench, or even check any
  1672.         arguments that were shift-selected with your icon.
  1673.         See WbArgs.e in the Src/Args dir how to
  1674.         make good use of wbmessage.
  1675.  
  1676. 6F. default arguments to functions
  1677. ----------------------------------
  1678.  
  1679. default arguments allows you to specify for one or more
  1680. arguments of a procedure which is the default value, if the
  1681. procedure is called with less args than parameters. for example,
  1682. a procedure like:
  1683.  
  1684. PROC bla(a,b=1,c=NIL)
  1685.  
  1686. can be called like:            is equivalent with:
  1687.  
  1688. bla(a,b,c)                bla(a,b,c)
  1689. bla(a,b)                bla(a,b,NIL)
  1690. bla(a)                    bla(a,1,NIL)
  1691.  
  1692. This can be useful and also express something about the
  1693. procedures function, i.e. that most of the time one would
  1694. call it with NIL anyway, so why not leave it out for clarity.
  1695. That's also why you should not overdo it with D.A.: do not
  1696. start specifying non-sensical values for procedures
  1697. out of pure laziness, if you feel a certain parameter really
  1698. has no default value.
  1699.  
  1700. to make calls with fewer args unambiguous, D.A. declarations
  1701. can only apply to the last 0..n parameters of a PROC of n parameters.
  1702.  
  1703. for example, illegal is:  PROC bla(a,b=1,c)
  1704.  
  1705. (you should then simply reorder the parameters, of course).
  1706. arguments supplied in a call are filled in from left to right,
  1707. missing arguments are added with D.A.'s as needed.
  1708.  
  1709. 6G. multiple return values
  1710. --------------------------
  1711. In E you can return any number of return values (max 3 in
  1712. Amiga E because of implementation reasons). How?
  1713.  
  1714. RETURN <exp>,<exp>,<exp>                 (or ENDPROC, of course)
  1715.  
  1716. example:
  1717.  
  1718. PROC sincos(rad)
  1719.   DEF sin,cos
  1720.   /* whatever computation is needed */
  1721. ENDPROC sin,cos
  1722.  
  1723. call with:
  1724.  
  1725. s,c:=sincos(3.14)
  1726. s:=sincos(1.00)
  1727.  
  1728. as you can see, there's a new statement of the form:
  1729.  
  1730. <var> , ... := <exp>
  1731.  
  1732. where <exp> makes mostly only sense as function call.
  1733. note two things:
  1734. - you can decide yourself how many values you wish to receive.
  1735.   this makes sense when the first retval is the main one,
  1736.   and the second/third optional infos, which might only be
  1737.   important to some callers.
  1738. - this form is a _statement_. this means that when you would
  1739.   call sincos() as part of another expression, only the
  1740.   first (the regular) return value is used:   fun(sincos(1.0))
  1741.  
  1742.  
  1743. 6H. function values
  1744. -------------------
  1745. With v3, you can also have functions as values, and pass these
  1746. freely around. they're different from quoted expression, since
  1747. they're called just like normal PROCs. example:
  1748.  
  1749. fun:={myproc}            -> get PROC ptr
  1750.  
  1751. ...
  1752.  
  1753. fun(1,2,3)            -> apply to args, just like normal PROC
  1754.  
  1755. notes:
  1756. - you have to be sure that the PROC you have a ptr to and the
  1757.   number of args are the same. the compiler can't check this for you.
  1758. - even worse: you have to be sure the ptr is a PROC at all.
  1759.   there is a compiler warning that may help you with this.
  1760.  
  1761.  
  1762. +---------------------------------------------------------------+
  1763. |                  7. DECLARATION OF CONSTANTS            |
  1764. +---------------------------------------------------------------+
  1765.  
  1766. 7A. const (CONST)
  1767. -----------------
  1768. syntax:        CONST <declarations>,...
  1769.  
  1770. Enables you to declare a constant. A declaration looks like:
  1771. <ident>=<value>
  1772. constants must be uppercase, and will in the rest of the program be
  1773. treated as <value>. Example:
  1774.  
  1775. CONST MAX_LINES=100, ER_NOMEM=1, ER_NOFILE=2
  1776.  
  1777. You cannot declare constants in terms of others that are being
  1778. declared in the same CONST statement: put these in the next.
  1779.  
  1780. CONST, ENUM and SET declarations are always global, i.e. it is not
  1781. possible to declare constants local to a PROC. The best place for
  1782. constant declarations is at the top of your source, but EC also
  1783. allows you to put them between two PROCs, for example.
  1784.  
  1785. 7B. enumerations (ENUM)
  1786. -----------------------
  1787. Enumerations are a specific type of constant that need not be given values,
  1788. as they simply range from 0 .. n, the first being 0. At any given point
  1789. in an enumeration, you may use the '=<value>' notation to set or reset
  1790. the counter value. Example:
  1791.  
  1792. ENUM ZERO, ONE, TWO, THREE, MONDAY=1, TUESDAY, WEDNESDAY
  1793.  
  1794. ENUM ER_NOFILE=100, ER_NOMEM, ER_NOWINDOW
  1795.  
  1796. 7C. sets (SET)
  1797. --------------
  1798. Sets are again like enumerations, with the difference that instead of
  1799. increasing a value (0,1,2,...) they increase a bitnumber (0,1,2,...) and
  1800. thus have values like (1,2,4,8,...). This has the added advantage that
  1801. they may be used as sets of flags, as the keyword says.
  1802. Suppose a set like the one below to describe properties of a window:
  1803.  
  1804. SET SIZEGAD,CLOSEGAD,SCROLLBAR,DEPTH
  1805.  
  1806. to initialise a variable to properties DEPTH and SIZEGAD:
  1807.  
  1808. winflags:=DEPTH OR SIZEGAD
  1809.  
  1810. to set an additional SCROLLBAR flag:
  1811.  
  1812. winflags:=winflags OR SCROLLBAR
  1813.  
  1814. and to test if either of both of two properties hold:
  1815.  
  1816. IF winflags AND (SCROLLBAR OR DEPTH) THEN /* whatever */
  1817.  
  1818.  
  1819. 7D. built-in constants
  1820. ---------------------
  1821. Following are built-in constants that may be used:
  1822.  
  1823. TRUE,FALSE    Represent the boolean values (-1,0)
  1824. NIL        (=0), the uninitialised pointer.
  1825. ALL        Used with string functions like StrCopy() to copy all characters
  1826. GADGETSIZE    Minimum size in bytes to hold one gadget; (see 9D, Gadget())
  1827. OLDFILE,NEWFILE    Mode-parameters for use with Open()
  1828. EMPTY        used with methods (might be keyword in the future)
  1829. STRLEN        Always has the value of the length of the last immediate
  1830.         string used. Example:
  1831.  
  1832.         Write(handle,'hi folks!',STRLEN)      /* =9 */
  1833.  
  1834.  
  1835.  
  1836. +---------------------------------------------------------------+
  1837. |                           8. TYPES                |
  1838. +---------------------------------------------------------------+
  1839.  
  1840. 8A. about the `type' system
  1841. ---------------------------
  1842. E doesn't have a rigid type-system like Pascal or Modula2, it's even more
  1843. flexible than C's type system: you might as well call it a datatype-system.
  1844. This goes hand in hand with the philosophy that in E all datatypes are
  1845. equal: all basic small values like characters, integers etc. All have
  1846. the same 32bit size, and all other datatypes like arrays and strings
  1847. are represented by 32bit pointers to them. This way, the e compiler can
  1848. generate code in a very polymorphic way.
  1849. The (dis)advantages are obvious:
  1850.  
  1851. disadvantages of the E-type system
  1852. - less compiler checking on silly errors you make
  1853.  
  1854. advantages:
  1855. - low-level polymorphism, easier to make powerful generic functions.
  1856. - flexible way of programming: no problem that some types of return values
  1857.   don't match, no superfluous "casts" etc., no unnecessary errormessages.
  1858. - no hard to find errors when mixing data of different sizes in expressions
  1859.  
  1860.  
  1861. 8B. the basic type (LONG/PTR)
  1862. -----------------------------
  1863. There's only one basic, non-complex variable type in E, which is the
  1864. 32bit type LONG. As this is the default type, it may be declared as:
  1865.  
  1866. DEF a:LONG             or just:            DEF a
  1867.  
  1868. This variable type may hold what's known as CHAR/INT/PTR/LONG types in other
  1869. languages. A special variation of LONG is the PTR type. This type
  1870. is compatible with LONG, with the only difference that it specifies
  1871. to what type it is a pointer. By default, the type LONG is specified
  1872. as PTR TO CHAR. Syntax:
  1873.  
  1874. DEF <var>:PTR TO <type>
  1875.  
  1876. where type is either a simple type or a compound type. Example:
  1877.  
  1878. DEF x:PTR TO INT, myscreen:PTR TO screen
  1879.  
  1880. Note that 'screen' is the name of an object as defined in intuition/screens.m
  1881. For example, if you open your own screen with:
  1882.  
  1883. myscreen:=OpenS(...   etc.
  1884.  
  1885. you may use the pointer myscreen as in 'myscreen.rastport'. However,
  1886. if you do not wish to do anything with the variable until you call
  1887. CloseS(myscreen), you may simply declare it as
  1888.  
  1889. DEF myscreen
  1890.  
  1891. Variable declarations may have optional initialisations, but only
  1892. integer constants, i.e. no full expression:
  1893.  
  1894. DEF a=1, b=NIL:PTR TO textfont
  1895.  
  1896.  
  1897. 8C. the simple type (CHAR/INT/LONG)
  1898. -----------------------------------
  1899. The simple types CHAR (8bit) and INT (16bit) may not be used as types
  1900. for a basic (single) variable; the reason for this must be clear by now.
  1901. However they may be used as data type to build ARRAYs from, set PTRs to,
  1902. use in the definition of OBJECTs etc. See those for examples.
  1903.  
  1904.  
  1905. 8D. the array type (ARRAY)
  1906. --------------------------
  1907. ARRAYs are declared by specifying their length (in bytes):
  1908.  
  1909. DEF b[100]:ARRAY
  1910.  
  1911. this defines an array of 100 bytes. Internally, 'b' is a variable of
  1912. type LONG and a PTR to this memory area.
  1913. Default type of an array-element is CHAR, it may be anything by specifying:
  1914.  
  1915. DEF x[100]:ARRAY OF LONG
  1916. DEF mymenus[10]:ARRAY OF newmenu
  1917.  
  1918. where "newmenu" is an example of a structure, called OBJECTs in E.
  1919. Array access is very easy with:   <var>[<sexp>]
  1920.  
  1921. b[1]:="a"
  1922. z:=mymenus[a+1].mutualexclude
  1923.  
  1924. Note that the index of an array of size n ranges from 0 to n-1,
  1925. and not from 1 to n.
  1926. Note that ARRAY OF <type> is compatible with PTR TO <type>, with the
  1927. only difference that the variable that is an ARRAY is already
  1928. initialised.
  1929.  
  1930.  
  1931. 8E. the complex type (STRING/LIST)
  1932. ----------------------------------
  1933. - STRINGs. Similar to arrays, but different in the respect that they may
  1934.   only be changed by using E string functions, and that they contain
  1935.   length and maxlength information, so string functions may alter them in a
  1936.   safe fashion, i.e: the string can never grow bigger than the memory
  1937.   area it is in. Definition:
  1938.  
  1939.   DEF s[80]:STRING
  1940.  
  1941.   The STRING datatype (called an estring) is backwards compatible with
  1942.   PTR TO CHAR and of course ARRAY OF CHAR, but not the other way around.
  1943.   (see 9B on string functions for more details).
  1944.  
  1945. - LISTs. These may be interpreted as a mix between a STRING and an ARRAY
  1946.   OF LONG. I.e: this data structure holds a list of LONG variables which may
  1947.   be extended and shortened like STRINGs. Definition:
  1948.  
  1949.   DEF x[100]:LIST
  1950.  
  1951.   A powerful addition to this datatype is that it also has a 'constant'
  1952.   equivalent [], like STRINGs have ''. LIST is backward compatible with
  1953.   PTR TO LONG and of course ARRAY OF LONG, but not the other way around.
  1954.   (see 9C and 2G) for more on this.
  1955.  
  1956.  
  1957. 8F. the compound type (OBJECT)
  1958. ------------------------------
  1959. OBJECTs are like a struct/class in C/C++ or a RECORD in pascal. Example:
  1960.  
  1961. OBJECT myobj
  1962.   a:LONG
  1963.   b:CHAR
  1964.   c:INT
  1965. ENDOBJECT
  1966.  
  1967. This defines a data structure consisting of three elements. Syntax:
  1968.  
  1969. OBJECT <objname>
  1970.   <membername> [ : <type> ]           /* any number of these */
  1971. ENDOBJECT
  1972.  
  1973. where type is one of the following:
  1974.  
  1975. CHAR/INT/LONG/<object>
  1976. PTR TO CHAR/INT/LONG/<object>
  1977. ARRAY OF CHAR/INT/LONG/<object>
  1978.  
  1979. (ARRAY is short for ARRAY OF CHAR)
  1980.  
  1981. like DEF declarations, omitting the type means :LONG.
  1982.  
  1983. Note that <membername> need not be a unique identifier,
  1984. it may be in other objects too. There are lots of ways to use objects:
  1985.  
  1986. DEF x:myobj                      /* x is a structure */
  1987. DEF y:PTR TO myobj               /* y is just a pointer to it */
  1988. DEF z[10]:ARRAY OF myobj
  1989.  
  1990. y:=[-1,"a",100]:myobj            /* typed lists */
  1991.  
  1992. IF y.b="a" THEN /* ... */
  1993.  
  1994. z[4].c:=z[d+1].b++
  1995.  
  1996. (see 4F and other parts of chapter 4 for these)
  1997.  
  1998. ARRAYs in objects are always rounded to even sizes, and put on
  1999. even offsets:
  2000.  
  2001. OBJECT mystring
  2002.   len:CHAR, data[9]:ARRAY
  2003. ENDOBJECT
  2004.  
  2005. SIZEOF mystring is 12, and "data" starts at offset 2.
  2006.  
  2007. 'PTR TO' is the only type in OBJECTs that may refer to yet undeclared
  2008. other objects.
  2009.  
  2010. (see 14A for all other OBJECT features that are somehow OO related)
  2011.  
  2012. 8G. initialisation
  2013. ------------------
  2014.  
  2015. 1. Always initialised to NIL (or else, if explicitly stated)
  2016.    - global variables
  2017.      NOTE: for documentation purposes, it's always nicer if you
  2018.      write =NIL in the definitions of variables that you expect to be NIL.
  2019. 2. Initialised to '' and [] resp.
  2020.    - global and local STRINGs
  2021.    - global and local LISTs
  2022. 3. Not initialised
  2023.    - local variables (unless explicitly stated)
  2024.    - global and local ARRAYs
  2025.    - global and local OBJECTs
  2026.  
  2027.  
  2028.  
  2029. 8H. the essentials of the E typesystem
  2030. --------------------------------------
  2031. This section tries to explain how the E typesystem works from
  2032. another perspective.
  2033.  
  2034. Most problems people have while programming in E stem from their incorrect
  2035. view of how the E type-system works, Also, many people have an idea how types
  2036. work from their previous programming language, and try to apply this to E,
  2037. which is often fatal, because E is quite different when it come to types.
  2038.  
  2039. The Type System.
  2040. but E is in essence a TYPELESS language. Indeed, variables may have a type,
  2041. but this is only used as a specification how to dereference a variable when
  2042. it is used as a pointer. In almost ALL other language constructions,
  2043. variables are treated as all being of the same type, namely the 32bit
  2044. typeless value.
  2045.  
  2046. In practise this means that for example in expressions with the exception
  2047. of the ".", "[]" and "++" operators etc., all operators and functions work
  2048. on 32bit values, regardless of whether they represent booleans, integers,
  2049. reals or pointers to something.
  2050.  
  2051. Pointer Types.
  2052. In the E type-system only 4 types exist, PTR TO CHAR, PTR TO INT,
  2053. PTR TO LONG and PTR TO <object>, where <object> is a name of a previously
  2054. defined OBJECT. When a variable (or an object member, as we'll see later)
  2055. is declared as being of this type, It means that if the variable contains
  2056. a value that is a legal pointer, this is how it should be dereferenced.
  2057.  
  2058. LONG, ARRAY etc.
  2059. All other types one may see in a DEF declaration are not really types, as
  2060. they really are only other ways of writing one of the above four. As an
  2061. example, ARRAY OF <type> is just another way of writing PTR TO <type>, with
  2062. the only difference that the former is automatically assigned the address
  2063. of an area of stackspace which is big enough to hold data for the #of
  2064. elements specified in square brackets.
  2065.  
  2066. Here's a table that shows all E 'types' in terms of the basic four:
  2067.  
  2068. ARRAY OF CHAR, ARRAY, STRING, LONG   (are equal to)   PTR TO CHAR
  2069. ARRAY OF INT                         (is equal to)    PTR TO INT
  2070. ARRAY OF LONG, LIST                  (are equal to)   PTR TO LONG
  2071. ARRAY OF <object>, <object>          (are equal to)   PTR TO <object>
  2072.  
  2073. - LONG is for variables that are not intended to be used as a pointer,
  2074.   i.e integers. Its equivalence with PTR TO CHAR is quite logical, as
  2075.   conceptually both talk about things that are measured in units of 1.
  2076.   (for example, "++" has the same effect on both)
  2077. - LIST and STRING are the same as their ARRAY equivalents, in respect
  2078.   to the fact that they're initialised to a piece of stack-space, but
  2079.   their stack representation is a little more complex to facilitate
  2080.   runtime bounds-checking (when used with the correct functions).
  2081. - an <object> is equivalent to [1]:ARRAY OF <object>. both represent
  2082.   an initialised PTR TO <object>.
  2083.  
  2084. In an OBJECT one can have the same declarations, with the addition of CHAR
  2085. and INT (similar to LONG), and the ommission of LIST and STRING, as these
  2086. are complex objects in their own right, and cannot be part of an object.
  2087.  
  2088. Deferencing.
  2089. Given a pointer p of some type,
  2090.  
  2091. "[]" may index other elements that are sequentially ordered next to
  2092.      the element it is currently pointing to. note that this allows for
  2093.      both positive and negative indices, and also no assumptions are made
  2094.      about where and how many elements are actually allocated.
  2095.  
  2096. "++" sets the pointer to the next element in memory, "--" to the previous
  2097.      one. note that these operators always operate on the pointer and
  2098.      never on the the element the pointer is pointing to.
  2099.  
  2100. "."  works similar to "[]", only now indexes the pointer by name, i.e. the
  2101.      pointer must be a PTR TO <object>.
  2102.  
  2103. "[]" and "." may be concatenated to a pointer p in any sequence, given the
  2104. fact that the previous resulting value again is known to be of a "PTR TO"
  2105. type.
  2106.  
  2107. One does not need to write out a de-reference in total, as in other
  2108. languages, e.g. if p is an ARRAY OF obj, instead of having to write
  2109. p[index].member you can write just p[index], which logically results
  2110. in the address of that object. This also explains why p[].member
  2111. is equivalent to p.member, since p[] is the same as p when it points
  2112. to an object.
  2113.  
  2114. Reference Semantics.
  2115. Another type-related issue that makes E somewhat different from other
  2116. languages and thus harder to grasp is it's accent on Reference Semantics
  2117. rather than Value Semantics. I'll try to argue why that's good here.
  2118.  
  2119. Informally, Reference Semantics means that objects in a language (mostly
  2120. other than the simple ones like LONGs) are represented by pointers, while
  2121. Value Semantics treats these objects as just being themselves. An example
  2122. of a language that has only Value Semantics is BASIC, examples of
  2123. languages that have them both are the C/C++ and Pascal type-of languages,
  2124. and examples of Reference only are newer Object Oriented languages,
  2125. functional languages like LISP and of course E.
  2126.  
  2127. Using Reference Semantics doesn't mean being occupied with pointers
  2128. all the time, rather you're worrying about them a lot less then in the
  2129. mixed case or the Value-only case, especially since in real life programs
  2130. most non-trivial data-structures get allocated dynamically which implies
  2131. pointers. The best example of this is LISP, where one programs heavily
  2132. with pointers without noticing. In E, one could easily forget STRING
  2133. is a pointer, given the easy by which one can pass it around to other
  2134. functions; in C often lots of "&" are needed where in the equivalent E
  2135. case none are, and the Oberon equivalent of bla('hallo') looks like
  2136. bla(sys.ADR('hallo')) because the string doesn't represent a pointer,
  2137. but a value as a whole...
  2138.  
  2139.  
  2140. +---------------------------------------------------------------+
  2141. |                     9. BUILT-IN FUNCTIONS            |
  2142. +---------------------------------------------------------------+
  2143.  
  2144. 9A. io functions
  2145. ----------------
  2146.  
  2147.     WriteF(formatstring,args,...)
  2148.     PrintF(formatstring,args,...)
  2149.  
  2150. prints a string (which may contain formatting codes) to stdout. Zero
  2151. to unlimited arguments may be added. Note that, as formatstrings may
  2152. be created dynamically, no check on the correct number of arguments
  2153. is (can be) made. Examples:
  2154.  
  2155. WriteF('Hello, World!\n')    /* just write a lf terminated string */
  2156.  
  2157. WriteF('a = \d \n',a)        /* writes: "a = 123", if a was 123 */
  2158.  
  2159. (see 2F about strings for more).
  2160. NOTE: if stdout=NIL, for example if your program was started from the
  2161. Workbench, WriteF() will create an output window, and put the handle
  2162. in conout and stdout. This window will automatically be closed on
  2163. exit of the program, after the user typed a <return>. WriteF() is the
  2164. only function that will open this window, so if you want to do IO
  2165. on stdout, and want to be sure stdout<>NIL, perform a "WriteF('')"
  2166. as first instruction of your program to ensure output. If you want
  2167. to open a console window yourself, you may do so by placing the resulting
  2168. file handle in the 'stdout' and 'conout' variables, as your window will
  2169. then be closed automatically upon exit. If you wish to close this window
  2170. manually, make sure to set 'conout' back to NIL, to signal E that there's
  2171. no console window to be closed. PrintF() is the same as WriteF only
  2172. uses the v37+ buffered IO.
  2173. both return the length of the string that was printed.
  2174.  
  2175.     Out(filehandle,char)      and      char:=Inp(filehandle)
  2176.  
  2177. Either write or read one single byte to some file or stdout
  2178. if char=-1 then an EOF was reached, or an error occurred.
  2179. Out returns the number of bytes actually written (<>1 is error).
  2180.  
  2181.     len:=FileLength(namestring)
  2182.  
  2183. lets you determine the length of a file you *may* wish to load, and
  2184. also, if it exists (returns -1 upon error/file not found).
  2185.  
  2186.     ok:=ReadStr(filehandle,estring)
  2187.  
  2188. (see 9B)
  2189.  
  2190.     oldout:=SetStdOut(newstdout)
  2191.     oldin:=SetStdIn(newstdin)
  2192.  
  2193. Sets the standard output variable 'stdout'. Equivalent for:
  2194. oldout:=stdout; stdout:=newstdout. Same goes for the stdin
  2195. variable.
  2196.  
  2197.  
  2198.  
  2199. 9B. strings and string functions
  2200. --------------------------------
  2201.  
  2202. E has a datatype STRING. This is a string, from now on called 'Estring',
  2203. that may be modified and changed in size, as opposed to normal 'strings',
  2204. which will be used here for any zero-terminated sequence. Estrings are
  2205. downward compatible with strings, but not the other way around, so if an
  2206. argument requests a normal string, it can be either of them. If an Estring
  2207. is requested, don't use normal strings. Example of usage:
  2208.  
  2209. DEF s[80]:STRING, n                -> s is an estring with a maxlen of 80
  2210. ReadStr(stdout,s)                  -> read input from the console
  2211. n:=Val(s)                          -> get a number out of it
  2212.   -> etc.
  2213.  
  2214. Note that all string functions will handle cases where string tends to
  2215. get longer than the maximum length correctly;
  2216.  
  2217. DEF s[5]:STRING
  2218. StrAdd(s,'this string is longer than 5 characters',ALL)
  2219.  
  2220. s will contain just 'this '.
  2221. A string may also be allocated dynamically from system memory
  2222. with the function String(), (note: the pointer returned from this function
  2223. must always be checked against NIL)
  2224.  
  2225.     s:=String(maxlen)
  2226.  
  2227. DEF s[80]:STRING     is equivalent to     DEF s     and     s:=String(10)
  2228.  
  2229.  
  2230.     bool:=StrCmp(string,string,len=ALL)
  2231.  
  2232. compares two strings. len must be the number of bytes to compare,
  2233. or 'ALL' if the full length is to be compared. Returns TRUE or FALSE
  2234. (len is a default argument (see 6F))
  2235.  
  2236.     StrCopy(estring,string,len=ALL)
  2237.  
  2238. copies the string into the estring. If len=ALL, all will be copied.
  2239. returns the estring.
  2240.  
  2241.     StrAdd(estring,string,len=ALL)
  2242.  
  2243. same as StrCopy(), only now the string is concatenated to the end.
  2244. returns the estring.
  2245.  
  2246.     len:=StrLen(string)
  2247.  
  2248. calculates the length of any zero-terminated string
  2249.  
  2250.     len:=EstrLen(estring)
  2251.  
  2252. returns the length of an estring
  2253.  
  2254.     max:=StrMax(estring)
  2255.  
  2256. returns the maximum length of a estring
  2257.  
  2258.         StringF(estring,fmtstring,args,...)
  2259.  
  2260. similar to WriteF, only now output goes to estring instead of stdout.
  2261. example:
  2262.  
  2263. StringF(s,'result: \d\n',123)
  2264.  
  2265. 's' will be 'result: 123\n'
  2266. returns the estring, and length as second returnvalue.
  2267.  
  2268.     RightStr(estring,estring,n)
  2269.  
  2270. fills estring with the last n characters of the second estring
  2271. returns the estring.
  2272.  
  2273.     MidStr(estring,string,pos,len=ALL)
  2274.  
  2275. copies any number of characters (including all if len=ALL) from
  2276. position pos in string to estring
  2277. NOTEZ BIEN: in all string related functions where a position in a
  2278. string is used, the first character in a string has position 0,
  2279. not 1, as is common in languages like BASIC.
  2280. returns the estring.
  2281.  
  2282.     value,read:=Val(string,read=NIL)
  2283.  
  2284. finds an integer encoded in ascii out of a string. Leading spaces/tabs
  2285. etc. will be skipped, and also hexadecimal numbers (1234567890ABCDEFabcdef)
  2286. and binary numbers (01) may be read this way if they are preceded by a
  2287. "$" or a "%" sign respectively. A minus "-" may indicate a negative integer.
  2288. Val() returns the number of characters read in the second argument, which
  2289. must be given by reference (<-!!!), or can be received as second returnvalue.
  2290. If "read" returns 0 (value will be 0 too) then the string did not contain an
  2291. integer, or the value was too sizy to fit in 32bit. "read" may be NIL.
  2292.  
  2293. examples of strings that would be parsed correctly:
  2294. '-12345', '%10101010', '   -$ABcd12'
  2295.  
  2296. these would return both as "value" and in read a 0:
  2297. '', 'hello!'
  2298.  
  2299.  
  2300.     foundpos:=InStr(string1,string2,startpos=0)
  2301.  
  2302. searches string1 for the occurrence of string2, possibly starting from
  2303. another position than 0. Returned is the offset at which the substring
  2304. was found, else -1.
  2305.  
  2306.     newstringadr:=TrimStr(string)
  2307.  
  2308. returns the *address* of the first character in a string, i.e., after
  2309. leading spaces, tabs etc.
  2310.  
  2311.     UpperStr(string)     and      LowerStr(string)
  2312.  
  2313. changes the case of a string.
  2314. TAKE NOTE: these functions modify the contents of 'string', so they may
  2315. only be used on estrings, and strings that are part of your programs data.
  2316. Effectively this means that if you obtain the address of a string through
  2317. some amiga-system function, you must first StrCopy() it to a string of
  2318. your program, then use these functions.
  2319. they return the string.
  2320.  
  2321.     ok:=ReadStr(filehandle,estring)
  2322.  
  2323. will read a string (ending in ascii 10) from any file or stdout.
  2324. ok contains -1 if an error occurred, or an EOF was reached.
  2325. Note: the contents of the string read so far is still valid.
  2326. Also note that, like Inp() Out(), etc. this function makes use
  2327. of unbuffered 1.3 style IO, and thus may be slow. The dos.library
  2328. Fgets() function forms a nice alternative.
  2329.  
  2330.     SetStr(estring,newlen)
  2331.  
  2332. manually sets the length of a string. This is only handy when you read
  2333. data into the estring by a function other then an E string function,
  2334. and want to continue using it as an Estring. For example, after
  2335. using a function that just puts a zero-terminated string at the
  2336. address of estring, use   SetStr(mystr,StrLen(mystr))  to make
  2337. it manipulatable again. If the string is too long, SetStr does nothing
  2338. (this should always be prevented).
  2339.  
  2340.     AstrCopy(string1,string2,size)
  2341.  
  2342. 'Array String Copy' copies string2 into the memory area denoted by string1.
  2343. string1 is typically not an estring but an ARRAY. size is the total #of chars
  2344. string1 can hold, i.e. if you write 5 and string2='helloworld', string1 will
  2345. be 'hell' + 0termination.
  2346.  
  2347.     order:=OstrCmp(string1,string2,max=ALL)
  2348.  
  2349. 'Ordered String Compare' returns 1 if string2>string1, 0 for equal and -1
  2350. for less. only max chars are compared.
  2351.  
  2352. for string linking functions (see 9H)
  2353.  
  2354.  
  2355. 9C. lists and list functions
  2356. ----------------------------
  2357.  
  2358. Lists are like strings, only they consist of LONGs, not CHARs.
  2359. They may also be allocated either global, local or dynamic:
  2360.  
  2361. DEF mylist[100]:LIST         /* local or global */
  2362. DEF a
  2363. a:=List(10)                  /* dynamic */
  2364.  
  2365. (note that in the latter case, pointer 'a' may contain NIL)
  2366. Just as strings may be represented as constants in expressions, lists
  2367. have their constant equivalent:
  2368.  
  2369. [1,2,3,4]
  2370.  
  2371. The value of such an expression is a pointer to an already initialised list.
  2372. Special feature is that they may have dynamic parts, i.e, which will
  2373. be filled in at runtime:
  2374.  
  2375. a:=3
  2376. [1,2,a,4]
  2377.  
  2378. moreover, lists may have some other type than the default LONG, like:
  2379.  
  2380. [1,2,3]:INT
  2381. [65,66,67,0]:CHAR                    /* equivalent with   'ABC'   */
  2382. ['topaz.font',8,0,0]:textattr
  2383. OpenScreenTagList(NIL,[SA_TITLE,'MyScreen',TAG_DONE])
  2384.  
  2385. As shown in the latter examples, lists are extremely useful with
  2386. system functions: they are downward compatible with an ARRAY OF LONG,
  2387. and object-typed ones can be used wherever a system function needs
  2388. a pointer to some structure, or an array of those.
  2389. Taglists and vararg functions may also be used this way.
  2390. NOTEZ BIEN: all list functions only work with LONG lists, typed-lists
  2391. are only convenient in building complex data structures and expressions.
  2392.  
  2393. As with strings, a certain hierarchy holds:
  2394. list variables -> constant lists -> array of long/ptr to long
  2395. When a function needs an array of long you might just as well give a list
  2396. as argument, but when a function needs a listvar, or a constant list,
  2397. then an array of long won't do.
  2398.  
  2399. It's important that one understands the power of lists and in particular
  2400. typed-lists: these can save you lots of trouble when building just
  2401. about any data-structure. Try to use these lists in your own programs,
  2402. and see what function they have in the example-programs.
  2403.  
  2404. summary:
  2405.  
  2406. [<item>,<item>,... ]        immediate list (of LONGs, use with listfuncs)
  2407. [<item>,<item>,... ]:<type>    typed list (just to build data structures)
  2408.  
  2409. If <type> is a simple type like INT or CHAR, you'll just have the
  2410. initialised equivalent of ARRAY OF <type>, if <type> is an object-name,
  2411. you'll be building initialised objects, or ARRAY OF <object>, depending
  2412. on the length of the list.
  2413.  
  2414. If you write    [1,2,3]:INT   you'll create a data structure of 6 bytes,
  2415. of 3 16bit values to be precise. The value of this expression then
  2416. is a pointer to that memory area. Same works if, for example, you have
  2417. an object like:
  2418.  
  2419. OBJECT myobject
  2420.   a:LONG, b:CHAR, c:INT
  2421. ENDOBJECT
  2422.  
  2423. writing    [1,2,3]:myobject     would then mean creating a data structure
  2424. in memory of 8 bytes, with the first four bytes being a LONG with value 1,
  2425. the following byte a CHAR with value 2, then a pad byte, and the last
  2426. two bytes an INT (2 bytes) with value 3. you could also write:
  2427.  
  2428. [1,2,3,4,5,6,7,8,9]:myobject
  2429.  
  2430. you would be creating an ARRAY OF myobject with size 3. Note that such
  2431. lists don't have to be complete (3,6,9 and so on elements), you may
  2432. create partial objects with lists of any size
  2433.  
  2434. One last note on data size: on the amiga, you may rely on the fact that
  2435. a structure like 'myobject' has size 8, and that it has a pad byte
  2436. to have word (16bit) alignment. It is however very likely that an
  2437. E-compiler for 80x86 architectures will not use the pad byte and make
  2438. it a 7byte structure, and that an E-compiler for a sun-sparc architecture
  2439. (if I'm not mistaken) will try to align on 32bit boundaries, thus make
  2440. it a 10 or 12 byte structure. Some microprocessors (they are rare, but
  2441. they exist) even use (36:18:9) as numbers of bits for their types
  2442. (LONG:INT:CHAR), instead of (32:16:8) as we're used to. So don't make too
  2443. great an assumption on the structure of OBJECTs and LISTs if you want to
  2444. write code that stands a chance of being portable or doesn't rely on side
  2445. effects.
  2446.  
  2447.     ListCopy(listvar,list,num=ALL)
  2448.  
  2449. Copies num elements from list to listvar. example:
  2450. DEF mylist[10]:LIST
  2451. ListCopy(mylist,[1,2,3,4,5],ALL)
  2452. returns listvar.
  2453.  
  2454.     ListAdd(listvar,list,num=ALL)
  2455.  
  2456. Copies num items of list to the tail of listvar.
  2457. returns listvar.
  2458.  
  2459.     ListCmp(list,list,num=ALL)
  2460.  
  2461. Compares two lists, or some part of them.
  2462.  
  2463.     len:=ListLen(list)
  2464.  
  2465. Returns length of list, like     ListLen([a,b,c])    would return 3
  2466.  
  2467.     max:=ListMax(listvar)
  2468.  
  2469. returns maximum possible length of a listvar.
  2470.  
  2471.     value:=ListItem(list,index)
  2472.  
  2473. functions as    value:=list[index]    with the difference that
  2474. list may also be a constant value instead of a pointer. This is
  2475. very useful in situations like this where we directly want to
  2476. use a list of values:
  2477.  
  2478. WriteF(ListItem(['ok!','no mem!','no file!'],error))
  2479.  
  2480. this prints an errormessage according to "error". it's similar to:
  2481.  
  2482. DEF dummy:PTR TO LONG
  2483. dummy:=['ok!','no mem!','no file!']
  2484. WriteF(dummy[error])
  2485.  
  2486.     SetList(listvar,newlen)
  2487.  
  2488. manually sets the length of a list. This will only be useful when you read
  2489. data into the list by a function other then a list-specific function,
  2490. and want to continue using it as a true list.
  2491.  
  2492. for list functions that make use of quoted expressions (see 11C).
  2493. for list linking functions (see 9H).
  2494.  
  2495.  
  2496. 9D. intuition support functions
  2497. -------------------------------
  2498.  
  2499.     wptr:=OpenW(x,y,width,height,IDCMP,wflags,title,
  2500.                     screen,sflags,gadgets,taglist=NIL)
  2501.  
  2502. creates a window where wflags are flags for window layout
  2503. (like BACKDROP, SIMPLEREFRESH e.d, usually $F) and sflags are
  2504. for specifying the type of screen to open on (1=wb,15=custom).
  2505. screen must only be valid if sflags=15, else NIL will do.
  2506. gadgets may point to a glist structure, which you can easily
  2507. create with the Gadget() function, else NIL.
  2508.  
  2509.     CloseW(wptr)
  2510.  
  2511. closes that screen again. Only difference from CloseWindow()
  2512. is that it accepts NIL-pointers and sets stdrast back to NIL.
  2513.  
  2514.     sptr:=OpenS(width,height,depth,sflags,title,taglist=NIL)
  2515.  
  2516. opens a custom screen for you. depth is number of bitplanes (1-6, 1-8 AGA).
  2517.  
  2518.     CloseS(sptr)
  2519.  
  2520. as CloseW(), now for screens.
  2521.  
  2522.     nextbuffer:=Gadget(buffer,glist,id,flags,x,y,width,string)
  2523.  
  2524. [warning: this function is a bit out of date]
  2525. This function creates a list of gadgets, which can then be put in your
  2526. window by giving them as an argument to OpenW(), or afterwards with
  2527. intuition functions like AddGlist().
  2528. buffer is mostly an ARRAY of at least GADGETSIZE bytes to hold all the
  2529. structures associated with one gadget, id is any number that may help you
  2530. remember which gadget was pressed when an IntuiMessage arrives.
  2531. Flags are: 0=normal gadget, 1=boolean gadget, 3=boolean gadget that is
  2532. selected. Width is width in pixels, that should be large enough to hold
  2533. the string, which will be auto-centered. glist should be NIL for the first
  2534. gadget, and glistvar for all others, so E may link all gadgets.
  2535. The function returns a pointer to the next buffer (=buffer+GADGETSIZE).
  2536. Example for three gadgets:
  2537.  
  2538. CONST MAXGADGETS=GADGETSIZE*3
  2539.  
  2540. DEF buf[MAXGADGETS]:ARRAY, next, wptr
  2541.  
  2542. next:=Gadget(buf,NIL,1,0,10,20,80,'bla')   /* the 1st gadget */
  2543. next:=Gadget(next,buf,... )
  2544. next:=Gadget(next,buf,... )                /* any amount linked 2 1st */
  2545.  
  2546. wptr:=OpenW( ...,buf)
  2547.  
  2548.     code:=Mouse()
  2549.  
  2550. gives you the current state of all 2 or 3 mouse buttons; left=1,
  2551. right=2 and middle=4. If for example code=3 then left and right were
  2552. pressed together.
  2553. NOTEZ BIEN: this is not a real intuition function, if you want to
  2554. know about mouse-events the proper way, you'll have to check the
  2555. intuimessages that your window receives. This is the only E
  2556. function that directly checks the hardware, and thus only useful
  2557. in demo-like programs and for testing. (DO NOT USE THIS FUNCTION
  2558. IN PROGRAMS THAT ARE SUPPOSED TO WORK UNDER THE OS)
  2559.  
  2560.     bool:=LeftMouse(win)     WaitLeftMouse(win)
  2561.  
  2562. intuition Mouse() alternatives for programs that only want to test for
  2563. a mouseclick.
  2564.  
  2565.     x:=MouseX(win)     y:=MouseY(win)
  2566.  
  2567. enables you to read the mouse coordinates. win is the window
  2568. they need to be relative to.
  2569.  
  2570.     class:=WaitIMessage(window)
  2571.  
  2572. This function makes it easier to just wait for a window event. It simply
  2573. waits until a intuimessage arrives, and returns the class of the event.
  2574. It stores other variables like code and qualifiers as private global
  2575. variables, for access with functions described below.
  2576. WaitIMessage() represents the following code:
  2577.  
  2578. PROC waitimessage(win:PTR TO window)
  2579.   DEF port,mes:PTR TO intuimessage,class,code,qual,iaddr
  2580.   port:=win.userport
  2581.   IF (mes:=GetMsg(port))=NIL
  2582.     REPEAT
  2583.       WaitPort(port)
  2584.     UNTIL (mes:=GetMsg(port))<>NIL
  2585.   ENDIF
  2586.   class:=mes.class
  2587.   code:=mes.code             /* stored internally */
  2588.   qual:=mes.qualifier
  2589.   iaddr:=mes.iaddress
  2590.   ReplyMsg(mes)
  2591. ENDPROC class
  2592.  
  2593. as you see, it gets exactly one message, and does not forget about
  2594. multiple messages arriving in one event, if called more than once.
  2595. For example, say you opened a window that displays something and just
  2596. waits for a closegadget (you specified IDCMP_CLOSEWINDOW only):
  2597.  
  2598. WaitIMessage(mywindow)
  2599.  
  2600. or, you have a program that waits for more types of events, handles
  2601. them in a loop, and ends on a closewindow event:
  2602.  
  2603. WHILE (class:=WaitIMessage(win))<>IDCMP_CLOSEWINDOW
  2604.   /* handle other classes */
  2605. ENDWHILE
  2606.  
  2607.     code:=MsgCode()    qual:=MsgQualifier()    iaddr:=MsgIaddr()
  2608.  
  2609. These all supply you with the private global variables as mentioned
  2610. before. the values returned are all defined by the most recent call
  2611. to WaitIMessage(). Example:
  2612.  
  2613. IF class:=IDCMP_GADGETUP
  2614.   mygadget:=MsgIaddr()
  2615.   IF mygadget.userdata=1 THEN  /* ... user pressed gadget #1 */
  2616. ENDIF
  2617.  
  2618.  
  2619.  
  2620. 9E. graphics support functions
  2621. ------------------------------
  2622.  
  2623. All graphics support functions that do not explicitly ask for a rastport,
  2624. make use of the system-variable 'stdrast'. It is automatically defined by
  2625. the last call to OpenW() or OpenS(), and is set to NIL by CloseW() and
  2626. CloseS(). Calling these routines while stdrast is still NIL is legal.
  2627. stdrast may be manually set by SetStdRast() or stdrast:=myrast
  2628.  
  2629.     Plot(x,y,colour=1)
  2630.  
  2631. Draws a single dot on your screen/window in one of the colours available.
  2632. colour ranges from 0-255, or 0-31 on pre-AGA machines.
  2633.  
  2634.     Line(x1,y1,x2,y2,colour=1)
  2635.  
  2636. Draws a line
  2637.  
  2638.     Box(x1,y1,x2,y2,colour=1)
  2639.  
  2640. Draws a box
  2641.  
  2642.     Colour(foreground,background=0)
  2643.  
  2644. sets the colours for all graphics functions (from the library) that
  2645. do not take a colour as argument. This is the colour *register*
  2646. (i.e 0-31) and not colour *value*
  2647. NOTE: functions that have "colour" as an argument, change the Apen
  2648. of stdrast.
  2649.  
  2650.     TextF(x,y,formatstring,args,...)
  2651.  
  2652. exactly the same function as WriteF(), only outputs to some (x,y) on
  2653. your stdrast, instead of stdout. (see 9A, WriteF() and strings in the language
  2654. reference). returns the length of the resulting string.
  2655.  
  2656.     oldrast:=SetStdRast(newrast)
  2657.  
  2658. changes the output rastport of the E graphics functions
  2659.  
  2660.     SetTopaz(size=8)
  2661.  
  2662. lets you set the font of the rastport "stdrast" to topaz, just to be sure
  2663. that some custom system font of the user won't screw up your window layout.
  2664. size is of course 8 or 9. Only to be used as last resort if you can't
  2665. support font-sensitivity.
  2666.  
  2667.     SetColour(screen,colourreg,r,g,b)
  2668.  
  2669. set colour register (0..255) of screen to certain RGB values.
  2670. each rgb value has a range of 0..255, i.e. 24bit colour. this
  2671. function will automatically rescale to 12bit colour if no AGA
  2672. is present, and also use the correct function.
  2673.  
  2674.  
  2675. 9F. system support functions
  2676. ----------------------------
  2677.  
  2678.     bool:=KickVersion(vers)
  2679.  
  2680. Will give TRUE if the kickstart in the machine your program is running
  2681. on is equal or higher than vers, else FALSE
  2682.  
  2683.     mem:=New(n)
  2684.  
  2685. This dynamically creates an array (or memory area, if you wish) of
  2686. n bytes. Difference with AllocMem() is that it is called automatically
  2687. with flags $10000 (i.e cleared mem, any type) and that no calls to
  2688. Dispose() are necessary, as it is linked to a memory list that is
  2689. automatically de-allocated upon exit of your program.
  2690. (see 4K, also)
  2691.  
  2692.     mem:=NewR(n)
  2693.  
  2694. same as New(), only now automatically raises the "MEM" exception
  2695. instead of return if no memory could be allocated.
  2696.  
  2697.     mem:=NewM(n,flags)
  2698.  
  2699. same as NewR(), but also allows you to specify flags (MEMF_CHIP etc.)
  2700.  
  2701.     Dispose(mem)
  2702.  
  2703. Frees any mem allocated by New(). You only have to use this function
  2704. if you explicitly wish to free memory _during_ your program, as all
  2705. is freed at the end anyway.
  2706.  
  2707.     CleanUp(returnvalue=0)
  2708.  
  2709. Exits the program from any point. It is the replacement for the DOS
  2710. call Exit(): never use it! instead use CleanUp(), which allows
  2711. for the deallocation of memory, closing libraries correctly etc.
  2712. The return value will be given to dos as returncode.
  2713. Cleanup() is ONLY necessary if you have to exit at a point different
  2714. from ENDPROC in main.
  2715.  
  2716.     amount:=FreeStack()
  2717.  
  2718. returns the amount of free stack space left. This should always be 1000 or
  2719. more. (see 16C on how E organizes its stack. If you don't do heavy recursion,
  2720. you need not worry about your free stack space.
  2721.  
  2722.     bool:=CtrlC()
  2723.  
  2724. Returns TRUE if Ctrl-C was pressed since you last checked, else FALSE.
  2725. This only works for programs running on a console, i.e. cli-programs.
  2726.  
  2727. Example of how these last three functions may be used:
  2728.  
  2729. /* calculate faculty from command-line argument */
  2730.  
  2731. OPT STACK=100000
  2732.  
  2733. PROC main()
  2734.   DEF num,r
  2735.   num:=Val(arg,{r})
  2736.   IF r=0 THEN WriteF('bad args.\n') ELSE WriteF('result: \d\n',fac(num))
  2737. ENDPROC
  2738.  
  2739. PROC fac(n)
  2740.   DEF r
  2741.   IF FreeStack()<1000 OR CtrlC() THEN CleanUp(5)    /* xtra check */
  2742.   IF n=1 THEN r:=1 ELSE r:=fac(n-1)*n
  2743. ENDPROC r
  2744.  
  2745. Of course, this recursion will hardly run out of stack space, and when it
  2746. does, it's halted by FreeStack() so fast you won't have time to press
  2747. CtrlC, but it's the idea that counts here.
  2748. A definition of fac(n) like:
  2749.  
  2750. PROC fac(n) IS IF n=1 THEN 1 ELSE fac(n-1)*n
  2751.  
  2752. would be less safe.
  2753.  
  2754.  
  2755.     mem:=FastNew(size)    FastDispose(mem,size)    FastDisposeList(list)
  2756.  
  2757. FastNew() and FastDispose() are replacements for NewR(size) and
  2758. Dispose(ptr) (they are used by NEW and END). this is what they have
  2759. in common:
  2760. - "NEW" exceptions may be Raised
  2761. - memory is always cleared
  2762. - auto-dealloc at end of program
  2763. but the following differences should be noted (positive):
  2764. - they are varying from 10 to 50 times faster (!)
  2765. - they use way less memory for small objects
  2766. - they do not fragment memory
  2767. [all this is for objects <=256 bytes, for bigger ones NewR() and
  2768.  Dispose() are used].
  2769. negative:
  2770. - they do not free mem, but recycle it.
  2771. - FastDispose() needs exact size of allocation. END also.
  2772.  
  2773. List allocated with NEW need the function FastDisposeList(). Because
  2774. Lists have a length, the size parameter isn't needed.
  2775.  
  2776.  
  2777. 9G. math and other functions
  2778. -------------------
  2779.  
  2780.     a:=And(b,c)           a:=Or(b,c)           a:=Not(b)
  2781.     a:=Eor(b,c)
  2782.  
  2783. These work with the usual operations, boolean as well as arithmetic.
  2784. Note that for And() and Or() an operator exists.
  2785.  
  2786.     a:=Mul(b,c)           a:=Div(a,b)
  2787.  
  2788. Performs the same operation as the '*' and '/' operators, but now in
  2789. full 32bit. For speed reasons, normal operations are 16bit*16bit=32bit
  2790. and 32bit/16bit=16bit. This is sufficient for nearly all calculations,
  2791. and where it's not, you may use Mul() and Div(). NOTE: in the Div
  2792. case, a is divided by b, not b by a.
  2793.  
  2794.         bool:=Odd(x)          bool:=Even(x)
  2795.  
  2796. Return TRUE or FALSE if some expression is Odd or Even
  2797.  
  2798.     Min(a,b)    Max(a,b)
  2799.  
  2800. compute min and max of the two given ints.
  2801.  
  2802.     randnum:=Rnd(max)    seed:=RndQ(seed)
  2803.  
  2804. Rnd() computes a random number from an internal seed in range 0 .. max-1.
  2805. For example,  Rnd(1000)   returns an integer from 0..999
  2806. To initialise the internal seed, call Rnd() with a negative value;
  2807. the Abs() of that value will be the initial seed.
  2808.  
  2809. RndQ() computes a random number "Q"uicker than Rnd() does, but returns
  2810. only full range 32bit random numbers. Use the result as the seed for
  2811. the next call, and for startseed, use any large value, like $A6F87EC1
  2812.  
  2813.     absvalue:=Abs(value)
  2814.  
  2815. computes the absolute value.
  2816.  
  2817.     s:=Sign(v)
  2818.  
  2819. computes the sign of v, i.e. returns -1,0,1
  2820.  
  2821.     a,b:=Mod(c,d)
  2822.  
  2823. Divides 32bit c by 16bit d and returns 16bit modulo a and optionally
  2824. a 16bit result of the division b. If these 16bit limits are exceeded,
  2825. Mod() will not give correct results.
  2826.  
  2827.     x:=Shl(y,num)         x:=Shr(y,num)
  2828.  
  2829. shifts y num bits to left or right (set new bits to 0).
  2830.  
  2831.     a:=Long(adr)          a:=Int(adr)          a:=Char(adr)
  2832.  
  2833. peeks into memory at some address, and returns the value found. This
  2834. works with 32, 16 and 8 bit values respectively. Note that the compiler does
  2835. not check if 'adr' is valid. These functions are available in E for
  2836. those cases where reading and writing in memory with PTR TO <type>
  2837. would only make a program more complex or less efficient. You are _not_
  2838. encouraged to use these functions.
  2839.  
  2840.     PutLong(adr,a)       PutInt(adr,a)        PutChar(adr,a)
  2841.  
  2842. Pokes value 'a' into memory. See: Long()
  2843.  
  2844.     y:=Bounds(x,a,b)
  2845.  
  2846. makes sure x lies between bounds a and b, and adjust acordingly if necessary.
  2847. It equals:    y:=IF x<a THEN a ELSE IF x>b THEN b ELSE x
  2848.  
  2849.  
  2850. 9H. string and list linking functions
  2851. -------------------------------------
  2852. E provides for a set of functions that allows the creation of
  2853. linked list with the STRING and LIST datatype, or strings and lists
  2854. that were created with String() and List() respectively. As you may
  2855. know by now, strings and lists, complex datatypes, are pointers
  2856. to their respective data, and have extra fields to a negative offset
  2857. of that pointer specifying their current length and maxlength. the
  2858. offsets of these fields are PRIVATE. as an addition to those two,
  2859. any complex datatype has a 'next' field, which is set to NIL by
  2860. default, which may be used to build linked list of strings, for example.
  2861. in the following, I will use 'complex' to denote a ptr to a STRING
  2862. or LIST, and 'tail' to denote another such pointer, or one that already
  2863. has other strings linked to it. 'tail' may also be a NIL pointer,
  2864. denoting the end of a linked list.
  2865. [note: these String-list functions have nothing to do with E-lists or
  2866.  Lisp-Cell lists]
  2867. The following functions may be used:
  2868.  
  2869.     complex:=Link(complex,tail)
  2870.  
  2871. puts the value tail into the 'next' field of complex. returns again complex.
  2872. example:
  2873.  
  2874. DEF s[10]:STRING, t[10]:STRING
  2875. Link(s,t)
  2876.  
  2877. creates a linked list like:    s --> t --> NIL
  2878.  
  2879.     tail:=Next(complex)
  2880.  
  2881. reads the 'next' field of var complex. this may of course be NIL, or
  2882. a complete linked list. Calling Next(NIL) will result in NIL, so it's
  2883. safe to call Next when you're not sure if you're at the end of a linked list.
  2884.  
  2885.     tail:=Forward(complex,num)
  2886.  
  2887. same as Next(), only goes forward num links, instead of one, thus:
  2888.  
  2889. Next(c) = Forward(c,1)
  2890.  
  2891. You may safely call Forward() with a num that is way too large;
  2892. Forward will stop if it encounters NIL while searching links, and
  2893. will return NIL.
  2894.  
  2895.     DisposeLink(complex)
  2896.  
  2897. same as Dispose(), with two differences: it's only for strings and
  2898. lists allocated with String() or List(), and will automatically
  2899. de-allocate the tail of complex too. Note that large linked lists
  2900. containing strings allocated with String() as well as some allocated
  2901. locally or globally with STRING may also be de-allocated this way.
  2902.  
  2903. For a good example of how linked lists of strings may be put to
  2904. good use in real-life programs, see Src/Utils/D.e
  2905.  
  2906.  
  2907. 9I. lisp-cells and cell functions
  2908. ---------------------------------
  2909. yep. that's right. you thought LISP was fun, then try E now.
  2910. [or: the story about why E is a better LISP than LISP itself :-)]
  2911.  
  2912. Starting from v3, E has the cell datatype, almost identical to cells
  2913. in the LISP language. more technically, E has:
  2914.  
  2915. `Conservative Mark and Sweep Garbage-Collected Lisp-Cells'
  2916.  
  2917. basically this amounts to being able to allocate LISP-cells,
  2918. which are pairs of two values:
  2919.  
  2920.     x:=<a|b>
  2921.  
  2922. which is much like NEW [a,b]:LONG, only now E will automatically
  2923. deallocate the 8 bytes in question itself when it finds out it needs
  2924. memory and no pointers are pointing to the cell. In practise this
  2925. means that you can freely have functions create cells as temporaries,
  2926. without worrying about freeing them. And any LISP-programmer will
  2927. be able to explain to you that with cells you can build any
  2928. data-structure (most notably trees and lists). [note: this text
  2929. does not thorougly explain how to make full use of cells, since
  2930. dozens of LISP books have been written about this]
  2931.  
  2932. Selecting the values can easily be done using Car(x) and Cdr(x),
  2933. two LISP-functions which select head and tail (first and second)
  2934. element of the cell. if x is a PTR TO LONG, even x[0] and x[1]
  2935. are allowed.
  2936.  
  2937. One can also write lists of cells:
  2938.  
  2939.     <a,b,c>
  2940.  
  2941. (note the commas) as short for
  2942.  
  2943.     <a|<b|<c|NIL>>>
  2944.  
  2945. An alternative for selection with Car/Cdr is E's unification:
  2946.  
  2947.     x <=> <a,b|c>
  2948.     a+b+c
  2949.  
  2950. instead of:
  2951.  
  2952.     Car(x)+Car(Cdr(x))+Cdr(Cdr(x))
  2953.  
  2954. lisp-cell unification resembles E-list unification (see 4L). for
  2955. example:
  2956.  
  2957.     x <=> <1,2|a>
  2958.  
  2959. equals:
  2960.  
  2961.     IF Car(x)=1
  2962.           IF Car(Cdr(x))=2
  2963.             a:=Cdr(Cdr(x))
  2964.             ...
  2965.  
  2966.  
  2967. A lisp-nil value is available "<>", which equals NIL and 0.
  2968.  
  2969. some functions are available (note that Cons() is _only_ available
  2970. through <...>)
  2971.  
  2972.     h:=Car(c)    t:=Cdr(c)
  2973.  
  2974. fix the head and the tail value of a cell c
  2975.  
  2976.     bool:=Cell(c)
  2977.  
  2978. gives a bool for whether or not c points at a cell, so Cell(<1>)=TRUE,
  2979. and Cell(3.14)=FALSE. This is not a fast function.
  2980.  
  2981.     n:=FreeCells()
  2982.  
  2983. tell you about the amount of free cells available. very slow function.
  2984. there should be no need to call this function other than curiosity.
  2985.  
  2986.     SetChunkSize(k)
  2987.  
  2988. Sets the chunksize to allocate for cells to k kilobyte. default is 128k.
  2989. This function can only be called once, and only before the first cons
  2990. (<..>) allocation takes place. Thereafter it has no effect.
  2991.  
  2992. In general, get a good book about lisp to understand more about
  2993. programming with cells.
  2994.  
  2995. One can write any LISP-functions in E, with exactly the same functionality:
  2996.  
  2997. PROC append(x,y) IS IF x THEN <Car(x)|append(Cdr(x),y)> ELSE y
  2998. PROC nrev(x) IS IF x THEN append(nrev(Cdr(x)),<Car(x)>) ELSE NIL
  2999. PROC sum(x) IS IF x THEN Car(x)+sum(Cdr(x)) ELSE 0
  3000.  
  3001. using a destructive implementation for functions like these is
  3002. also allowed.
  3003.  
  3004. techy stuff:
  3005. E's garbage collector implements a conservative mark and sweep algorithm
  3006. that was tested to be 5 to 25 times faster than several logical and
  3007. functional language implementations on the Amiga. Conservative
  3008. means that in case of doubt, the GC will not deallocate a cell. this
  3009. is necessary since in a typeless language such as E, the GC can
  3010. easily bump into a value that is not a valid pointer etc.
  3011.  
  3012. The GC allocates big chunks (default 128k), in which it allocates
  3013. cells. if out of cells, it will collect garbage by scanning the
  3014. stack and registers for pointers into the cellspace, and recursively
  3015. mark them. after that, all unmarked cells are reused, and if the
  3016. gain after a collection was only small, a new chunk is allocated
  3017. (if this fails, "NEW" is raised).
  3018.  
  3019. interaction with other E values:
  3020. - storing other values in cells is no problem whatsoever. objects,
  3021.   strings, floats, anything can be put into a cell without confusing
  3022.   the GC too much.
  3023. - storing cells in other values, for example a ptr to a cell in a
  3024.   dynamic object, is problematic, since the GC won't be able to find
  3025.   it there. a solution for this will be provided. However I think this
  3026.   case will seldom occur.
  3027.   ptrs to cells can safely be stored in global and local variables,
  3028.   even registers, and any stack datastructures.
  3029.   [and most importantly, in other cells!]
  3030.  
  3031. caveats:
  3032. - The GC currently can't collect cells that have a Car-list >1000
  3033.   long or so, i.e. <<<NIL:a>:b>:c>, but then 1000 instead of 3
  3034.   entries. this will hardly ever occur since lists like this
  3035.   are usually formed as Cdr-lists, which the GC can handle into
  3036.   infinity. (it will raise "STCK" if this fails")
  3037. - inline assembly code should never push stuff on the stack that
  3038.   is not LONG aligned. this was already necessary in v2.1b,
  3039.   but now is even more essential.
  3040.  
  3041. There's a trade off in chunk-size between time and space.
  3042. Allocating small chunks obviously is nice since you won't waste
  3043. any memory, however, when collecting garbage, the effort for
  3044. each pointer to trace is almost proportional to the number of
  3045. spaces. therefore:
  3046. - if speed is most important tune the chunkspacesize such that
  3047.   that only one space is needed. if the top cell-memory usage at a
  3048.   certain time is 50k, a chunkspace of 100k or 150k will give
  3049.   optimal performance.
  3050. - if memory usage is more important, in the example above a
  3051.   chunksize of 20k or 30k will be quite optimal for memory.
  3052. In general, time a heavy usage of your cell-algorithm with
  3053. different sizes to see what trade-off suits you best.
  3054.  
  3055.  
  3056. +---------------------------------------------------------------+
  3057. |               10. LIBRARY FUNCTIONS AND MODULES        |
  3058. +---------------------------------------------------------------+
  3059.  
  3060. 10A. built-in library calls
  3061. --------------------------
  3062. As you may have noticed from previous sections, the piece of code
  3063. automatically linked to the start of your code, called the "initialisation code",
  3064. always opens the three libraries intuition, dos, graphics and (and sometimes
  3065. mathieeesingbas), and because of this, the compiler has all the calls to those
  3066. four libraries (including exec) integrated in the compiler (there are a few hundred
  3067. of them). These are up to AmigaDos v3.00 (v39). To call Open() from the dos library,
  3068. simply say:
  3069.  
  3070. handle:=Open('myfile',OLDFILE)
  3071.  
  3072. or AddDisplayInfo() from the graphics library:
  3073.  
  3074. AddDisplayInfo(mydispinfo)
  3075.  
  3076. it's as simple as that.
  3077.  
  3078.  
  3079. 10B. interfacing to the amiga system with the v39 modules
  3080. ----------------------------------------------------------
  3081. To use any other library than the five in the previous section, you'll
  3082. need to resort to modules. Also, if you wish to use some OBJECT or CONST
  3083. definition from the Amiga includes as is usual in C or assembler,
  3084. you'll need modules. Modules are binary files which may include constant,
  3085. object, library and function (code) definitions. The fact that they're
  3086. binary has the advantage over ascii (as in C and assembly), that they
  3087. need not be compiled over and over again, each time your program is
  3088. compiled. The disadvantage is that they cannot simply be viewed; they
  3089. need a utility like ShowModule (see 17A) to make their contents
  3090. visible. The modules that contain the library definitions (i.e the calls)
  3091. are in the root of emodules: (the modules dir in the distribution), the
  3092. constant/object definitions are in the subdirectories, structured just
  3093. like the originals from Commodore.
  3094.  
  3095. MODULE
  3096.  
  3097. syntax:        MODULE <modulenames>,...
  3098.  
  3099. Loads a module. A module is a binary file containing information on libraries,
  3100. constants, and sometimes functions. Using modules enables you to use
  3101. libraries and functions previously unknown to the compiler.
  3102.  
  3103. Now for an example, below is a short version of the source/examples/asldemo.e
  3104. source that uses modules to put up a filerequester from the 2.0 Asl.library.
  3105.  
  3106.  
  3107. MODULE 'Asl', 'libraries/Asl'
  3108.  
  3109. PROC main()
  3110.   DEF req:PTR TO filerequester
  3111.   IF aslbase:=OpenLibrary('asl.library',37)
  3112.     IF req:=AllocFileRequest()
  3113.       IF RequestFile(req) THEN WriteF('File: "\s" in "\s"\n',req.file,req.drawer)
  3114.       FreeFileRequest(req)
  3115.     ENDIF
  3116.     CloseLibrary(aslbase)
  3117.   ENDIF
  3118. ENDPROC
  3119.  
  3120.  
  3121. From the modules 'asl', the compiler takes asl-function definitions like
  3122. RequestFile(), and the global variable 'aslbase', which only needs to
  3123. be initialised by the programmer. From 'libraries/Asl', it takes
  3124. the definition of the filerequester object, which we use to read the
  3125. file the user picked. Well, that wasn't all that hard: did you think
  3126. it was that easy to program a filerequester in E?
  3127.  
  3128. 10C. compiling own modules
  3129. --------------------------
  3130. with v3, you can gather all PROCs, CONSTs, OBJECTs and to
  3131. some extent also global variables that you feel somehow belong
  3132. together in one source, write "OPT MODULE" to signal EC that
  3133. this is supposed to be a module, and then compile all to a
  3134. .m file to be used in the main program, just like you used to
  3135. do with the old modules.
  3136.  
  3137. by default, all elements in a module are PRIVATE, i.e. not accessable
  3138. to the code that imports the .m file. to show which elememts
  3139. you wish to be visible in the module, simply write EXPORT
  3140. before it:
  3141.  
  3142. EXPORT ENUM TESTING,ONE,TWO,THREE,FOUR
  3143.  
  3144. EXPORT DEF important_glob_var, bla:PTR TO x
  3145.  
  3146. EXPORT OBJECT x
  3147.   next, index, term
  3148. ENDOBJECT
  3149.  
  3150. EXPORT PROC burp()
  3151.   /* whatever */
  3152. ENDPROC
  3153.  
  3154. "EXPORT" is useful in making a distinction between private and
  3155. public, especially when all functions of an OBJECT can be accessed
  3156. via PROCs, you may wish to keep OBJECT private as an effective
  3157. method of data hiding. more on this topic, (see 14C)
  3158. [EXPORT can be written on any line, doesn't affect everything though.]
  3159.  
  3160. If in a module _all_ elememts need to be exported (for example
  3161. one with only constants), a 'OPT EXPORT' will export all, without
  3162. the need for individual EXPORT keywords.
  3163.  
  3164. global variables require extra attention:
  3165. - try to avoid lots of global variables. having lot of globals
  3166.   in modules makes projects messy and error-prone
  3167. - globs in a module cannot have initialisations directly
  3168.   in the DEF statement (reason for this will become clear
  3169.   below). for example:
  3170.   DEF a             not     DEF a=1
  3171.   DEF a:PTR TO x    not     DEF a[10]:ARRAY OF x
  3172. - globals in a module which are not exported function as
  3173.   local for the module, i.e. they'll never clash with globals
  3174.   in other modules. those who _are_ exported though, are
  3175.   combined with the others, i.e. if in both the main program
  3176.   and in a module a variable with the same name are used,
  3177.   this will be one and the same variable. that's why
  3178.   one can write DEF a[10]:ARRAY OF x in the main program,
  3179.   and EXPORT DEF a:PTR TO x in the module, to share the
  3180.   array. Also, if both use for example 'gadtools.m',
  3181.   only one of the two needs to initialise 'gadtoolsbase'
  3182.   for both to be able to make calls to the library.
  3183.   If you do not want librarybases to be shared (i.e. you
  3184.   want to have a local, private library base), simply
  3185.   redeclare it in a DEF in the module that is not EXPORTed.
  3186.   If you export a variable in a general purpose
  3187.   module, make sure to give it a pretty unique name.
  3188. - using globals in modules which provide general purpose
  3189.   datatypes needs special attention, as the module may be
  3190.   in use from more than one other module, in which case
  3191.   it may be unclear who is responsable for resources.
  3192.   take good care of this.
  3193.  
  3194. Using modules in modules
  3195.  
  3196. This requires little extra attention. If the module (B) you include
  3197. in your own module (A) is one that only declares CONSTs, LIBRARYs and
  3198. OBJECTs (without code) nothing special happens, however if B includes
  3199. PROCs, then it's obvious this code needs to be linked later to the
  3200. main program when A is linked. Therefore if a main program uses A,
  3201. B will need to be present for compilation. The fact that A needs
  3202. B is stored in A, and can be viewed with ShowModule. This chain
  3203. of uses may grow out to a tree of dependencies, which has the result
  3204. that if you use just one module in your program, a lot of others
  3205. are automatically linked to it. Thus, E's module system automatically
  3206. keeps track of dependancies that other languages need makefiles for.
  3207. EC also allows for circular inclusions, and loads/links modules at most
  3208. once (i.e. doesn't link unused modules). One thing E's module system
  3209. doesn't automatically do for you is recompile dependant modules. If
  3210. you change B, it is often necessary to recompile A too, since it
  3211. might be referring to offsets etc. in the old version of B, which
  3212. might cause code to crash. If this gets too complex in your project,
  3213. use a utility such as E-Build (see 17I).
  3214.  
  3215.  
  3216. Try out the new ShowModule (see 17A) to see what EC puts in modules.
  3217.  
  3218.  
  3219. Including modules from other directories.
  3220.  
  3221. By default, a module name is prefixed by 'emodules:' to obtain
  3222. the actual file. Now you can prefix the name with a '*' to
  3223. denote the directory the source is in, so:
  3224.  
  3225. MODULE 'bla', '*bla'
  3226.  
  3227. if this statement would be in source 'WORK:E/burp.e', these two
  3228. modules would be 'emodules:bla.m' and 'WORK:E/bla.m'.
  3229.  
  3230. This is naturally the way to include components of your app into
  3231. other parts. If you write modules that you use in many of your programs
  3232. it would be handy to store them in the emodules hierarchy, and the
  3233. place for this is the 'emodules:other/' dir.
  3234.  
  3235.  
  3236.  
  3237. 10D. the modulecache
  3238. --------------------
  3239. (see 17D, ShowCache/FlushCache about this).
  3240.  
  3241.  
  3242. +---------------------------------------------------------------+
  3243. |                    11. QUOTED EXPRESSIONS            |
  3244. +---------------------------------------------------------------+
  3245.  
  3246. 11A. quoting and scope
  3247. ----------------------
  3248. Quoted expressions start with a backquote. The value of a quoted
  3249. expression is not the result from the computation of the expression,
  3250. but the address of the code. This result may then be passed on as
  3251. a normal variable, or as an argument to certain functions.
  3252. example:
  3253.  
  3254. myfunc:=`x*x*x
  3255.  
  3256. myfunc is now a pointer to a `function' that computes x^3 when evaluated.
  3257. These pointers to functions are very different from normal PROCs, and
  3258. you should never mix the two up. The biggest differences are that a
  3259. quoted expression is just a simple expression, and thus cannot have its
  3260. own local variables. In our example, "x" is just a local or global variable.
  3261. That's where we have to be cautious:
  3262. if we evaluate myfunc somewhat later in the same PROC, x may be local,
  3263. but if myfunc is given as parameter to another PROC, and then evaluated,
  3264. x needs of course to be global. There's no scope checking on this.
  3265.  
  3266. 11B. Eval()
  3267. -----------
  3268.     Eval(func)
  3269.  
  3270. simply evaluates a quoted expression (exp = Eval(`exp)).
  3271.  
  3272. NOTE: because E is a somewhat typeless language, accidentally writing
  3273. "Eval(x*x)"  instead of  "Eval(`x*x)"  will go unnoticed by the
  3274. compiler, and will give you big runtime problems: the value of x*x
  3275. will be used as a pointer to code.
  3276.  
  3277. To understand why 'quoted expressions' is a powerful feature think of the
  3278. following cases: if you were to perform a set of actions on a set of different
  3279. variables, you'd normally write a function, and call that function with
  3280. different arguments. But what happens when the element that you want to give
  3281. as argument is a piece of code? in traditional languages this would not be
  3282. possible, so you would have to 'copy' the blocks of code representing your
  3283. function, and put the expression in it. Not in E. say you wanted to write
  3284. a program that times the execution time of different expressions. In E you
  3285. would simply write:
  3286.  
  3287. PROC timing(func,title)
  3288.   /* do all sorts of things to initialise time */
  3289.   Eval(func)
  3290.   /* and the rest */
  3291.   WriteF('time measured for \s was \d\n',title,t)
  3292. ENDPROC
  3293.  
  3294. and then call it with:
  3295.  
  3296. timing(`x*x*x,'multiplication')
  3297. timing(`sizycalc(),'large calculation')
  3298.  
  3299.  
  3300. in any other imperative language, you would have to write out
  3301. copies of timing() for every call to it, or you would have to
  3302. put each expression in a separate function. This is just a simple
  3303. example: think about what you could do with data structures (LISTs)
  3304. filled with unevaluated code:
  3305.  
  3306. drawfuncs:=[`Plot(x,y,c),`Line(x,y,x+10,y+10,c),`Box(x,y,x+20,y+20,c)]
  3307.  
  3308. Note that this idea of functions as normal variables/values is not new
  3309. in E, quoted expressions are literally from LISP, which also has the
  3310. somewhat more powerful so-called Lambda function, which can also be
  3311. given as argument to functions; E's quoted expressions can also be
  3312. seen as parameterless (or global parameter only) lambdas.
  3313.  
  3314.  
  3315. 11C. built-in functions
  3316. -----------------------
  3317.  
  3318.     MapList(varadr,list,listvar,func)
  3319.  
  3320. performs some function on all elements of list and returns all
  3321. results in listvar. func must be a quoted expression (see 11A),
  3322. and var (which ranges over the list) must be given by reference. Example:
  3323.  
  3324. MapList({x},[1,2,3,4,5],r,`x*x)       results r in:     [1,4,9,16,25]
  3325.  
  3326. returns listvar.
  3327.  
  3328.     ForAll(varadr,list,func)
  3329.  
  3330. Returns TRUE if for all elements in the list the function (quoted
  3331. expression) evaluates to TRUE, else FALSE. May also be used to perform
  3332. a certain function for all elements of a list:
  3333.  
  3334. ForAll({x},['one','two','three'],`WriteF('example: \s\n',x))
  3335.  
  3336.     Exists(varadr,list,func)
  3337.  
  3338. As ForAll(), only this one returns TRUE if for any element the function
  3339. evaluates to TRUE (<>0). note that ForAll() always evaluates all elements,
  3340. but Exists() possibly does not.
  3341.  
  3342.     SelectList(v,list,listvar,quotedexp)
  3343.  
  3344. Much like MapList(), only now doesn't store the result from quotedexp,
  3345. it uses it as a boolean value, and only those values for which it is
  3346. true are stored in listvar (which should be capable of holding
  3347. the same amount of elements as list. example:
  3348.  
  3349. SelectList({x},[1,2,0,3,NIl],r,`x<>0)
  3350.  
  3351. results in r being [1,2,3].
  3352. returns length of listvar.
  3353.  
  3354. Example of how to use these functions in a practical fashion:
  3355. we allocate different sizes of memory in one statement, check them
  3356. all together at once, and free them all, but still only those that
  3357. succeeded. (example is v37+)
  3358.  
  3359.  
  3360. PROC main()
  3361.   DEF mem[4]:LIST,x
  3362.   MapList({x},[200,80,10,2500],mem,`AllocVec(x,0))              -> alloc some
  3363.   WriteF(IF ForAll({x},mem,`x) THEN 'Yes!\n' ELSE 'No!\n')        -> suxxes ?
  3364.   ForAll({x},mem,`IF x THEN FreeVec(x) ELSE NIL)     -> free only those <>NIL
  3365. ENDPROC
  3366.  
  3367.  
  3368. Note the absence of iteration in this code. Just try to rewrite this
  3369. example in any other language to see why this is special.
  3370.  
  3371.  
  3372. +---------------------------------------------------------------+
  3373. |                  12. FLOATING POINT SUPPORT            |
  3374. +---------------------------------------------------------------+
  3375.  
  3376.  
  3377. REALs (or FLOATs, whatever) are very different in E than in other
  3378. languages. This mainly has to do with the fact that E doesn't
  3379. really discriminate between types of values. One is advised to
  3380. understand this chapter _well_ before attempting to use floats.
  3381.  
  3382.  
  3383. 12A. float values
  3384. -----------------
  3385. In E, a float is just another 32bit value. The E compiler treats
  3386. them just like integers or pointers, with the difference that
  3387. their bit representation means something different. The E float
  3388. format is the IEEEsingle standard.
  3389.  
  3390. A float value looks like an integer value with the exception that
  3391. somewhere a "." is present. for example, the following are valid 
  3392. floats:
  3393.  
  3394.     3.14159    .1    1.    -12345.6
  3395.  
  3396. these aren't:
  3397.  
  3398.     .    1234
  3399.  
  3400. (i.e. atleast one "." and one "0-9" char must be present).
  3401.  
  3402. You can use these values at almost all places where LONG values
  3403. are legal, i.e. if you have have a function or datastructure that
  3404. handles arbitrary LONG values, it will also handle floats.
  3405.  
  3406.     DEF f=3.14
  3407.     myobj.x:=.1
  3408.     fun(f,2.73)
  3409.  
  3410.  
  3411.  
  3412. 12B. computing with floats
  3413. --------------------------
  3414. Because to E a float will seem like just another LONG, it will happily
  3415. apply integer math to it when used in an expression, which is mostly
  3416. not what you want. Also, one would like to be able to convert to
  3417. integer and vice-versa. The float operator "!" handles all this.
  3418.  
  3419. assume in the following examples that a,b,c contain integer values,
  3420. and x,y,z float values.
  3421.  
  3422. By default, an expression in E is considered an integer expression.
  3423. what the "!" does when it occurs in an expression is the following:
  3424. - changes the expression from int to float. any operators following
  3425.   (+ * - / = <> > < >= <=) will be float operations. "!" may occur
  3426.   any number of times in an expression, changing from and to float
  3427.   again and again.
  3428. - the expression that did occur before the "!", if any, is converted
  3429.   to the appropriate type.
  3430.  
  3431. examples:
  3432.  
  3433.     x:=a!
  3434.  
  3435. converts "a" to float, and stores the result in x. "a" is an integer exp,
  3436. which is then toggled to float, which implies a conversion.
  3437.  
  3438.     a:=!x!
  3439.  
  3440. converts "x" to integer and stores the result in a.
  3441.  
  3442.     x:=y
  3443.  
  3444.     x:=Ftan(y)
  3445.  
  3446. no "!" is needed here since no operator-math or conversions are necessary.
  3447.  
  3448.     x:=!y*z
  3449.  
  3450. the "*" acts on y and z as floats, since "!" denotes the whole as
  3451. a float-exp. the float result is stored in x
  3452.  
  3453.     a:=b!*x+y!
  3454.  
  3455. a more complex example: the int "b" is converted to float, then x
  3456. and y are float-multiplied and float-added to it. The result is converted
  3457. to int and stored in the int "a"
  3458.  
  3459.     x:=!y*z-z*y+(a!)+z/z
  3460.  
  3461.     z:=!x*Fsin(!x*y)
  3462.  
  3463. all (+ * - /) are computed as float, and the int "a" is converted
  3464. to float somewhere in the middle. since "(" ")" denotes a new expression,
  3465. it has it's own status of "!". Same idea for the function below.
  3466.  
  3467.     IF !x<0.1 THEN WriteF('Float value too small!\n')
  3468.  
  3469. as you can see, "!" also works on the six comparison operators.
  3470.  
  3471.  
  3472.  
  3473. 12C. builtin float functions
  3474. ----------------------------
  3475.  
  3476. Some trans-math functions are present, more will probably follow.
  3477.  
  3478.     x:=Fsin(y)    x:=Fcos(y)    x:=Ftan(y)
  3479.  
  3480. usual sin() etc. functions. they work with radians.
  3481.  
  3482.     x:=Fabs(y)
  3483.  
  3484. compute absolute value of y
  3485.  
  3486.     x:=Ffloor(y)    x:=Fceil(y)
  3487.  
  3488. compute lowest and highest whole-number float value near y
  3489.  
  3490.     x:=Fexp(y)    x:=Flog(y)    Flog10(y)    x:=Fpow(y,z)    Fsqrt(y)
  3491.  
  3492. compute e^y, ln(y), log base 10, z^y and square root of y, respectively.
  3493.  
  3494.     x,n:=RealVal(s)
  3495.  
  3496. parses string "s" to produce float value x. will skip leading spaces and tabs.
  3497. n is the number of characters parsed from the start of the string, or 0
  3498. if it couldn't be parsed as a float value. "x" will then be 0.0.
  3499. accepts negative numbers (and number without a ".", even).
  3500. example:
  3501.  
  3502. RealVal(' 3.14 ')    results in    3.14, 5
  3503. RealVal('blabla')    results in    0.0, 0
  3504.  
  3505.     s:=RealF(s,x,n)
  3506.  
  3507. Format a float value x to the estring s, with n positions after the ".".
  3508. max for "n" is 8, even less if you have lots of digits leading the ".".
  3509. an "n" of 0 will denote no fraction. The string is returned as result,
  3510. so it can be reused in a WriteF() for example:
  3511.  
  3512. WriteF('float = \s\n',RealF(s,3.14159),4)    results in    'float = 3.1416\n'
  3513.  
  3514. RealF() tries hard to make sensible roundings for a certain "n", as
  3515. the example shows. negative numbers are also handled properly.
  3516.  
  3517. RealF(s,-3.14159,0)    results in    '-3'
  3518.  
  3519.  
  3520.  
  3521. 12D. float implementation issues
  3522. --------------------------------
  3523. As said before, the E float format is IEEE (single), this means that
  3524. older float code using the FFP format with the SpXxx functions will
  3525. have to be rewritten (as stated in the v2.1b docs). The mathffp
  3526. library is no longer directly supported by EC v3.0, and you'll
  3527. have to open this library like all others if you want to use it.
  3528.  
  3529. single IEEE's were chosen because:
  3530. - double IEEE's don't fit in a LONG
  3531. - the FFP format routines do not make use of a 68881 if present,
  3532.   the IEEE ones do. Furthermore the FFP format is incompatible
  3533.   with the 68881, which also uses IEEE format.
  3534. - IEEE is the worldwide float-format standard, which encourages
  3535.   data-file compatability among software/platforms.
  3536.  
  3537. E's float routines use the mathieeesingbas.library and the
  3538. mathieeesingtrans.library, which are not by default supplied
  3539. with the ancient v1.3 of the OS. This means that if you want
  3540. to write under / support 1.3 AND you want to use the _builtin_
  3541. floats, you have to make sure these libraries are present (they
  3542. seem to be available, maybe through commodore?).
  3543.  
  3544. Both EC and the programs it generates do not open these libraries
  3545. as long as no float-features are used.
  3546.  
  3547. If all else fails, one can always use other floatlibraries to use
  3548. floats with 1.3. I might recommend the tools/longreal.m module
  3549. which uses doubles.
  3550.  
  3551. In the future, EC will probably allow mathieee library calls to
  3552. be replaced with inline 68881 code transparently.
  3553.  
  3554. [note: v3.1 (v40) of the amiga operating system is known to contain
  3555.  a bug in the IEEE code. Be sure to run a SetPatch that fixes this]
  3556.  
  3557. +---------------------------------------------------------------+
  3558. |                      13. EXCEPTION HANDLING            |
  3559. +---------------------------------------------------------------+
  3560.  
  3561. 13A. defining exception handlers (HANDLE/EXCEPT)
  3562. ------------------------------------------------
  3563. The exception mechanism in E is basically the same as in ADA; it
  3564. provides for flexible reaction on errors in your program and
  3565. complex resource management. NOTE: the term 'exception' in E has
  3566. very little to do with exceptions caused directly by 680x0 processors.
  3567.  
  3568. An exception handler is a piece of program code that will be invoked
  3569. when runtime errors occurs, such as windows that fail to open or
  3570. memory that is not available. You, or the runtime system itself,
  3571. may signal that something is wrong (this is called "raising an
  3572. exception"), and then the runtime-system will try and find the
  3573. appropriate exception handler. I say "appropriate" because a program
  3574. can have more than one exception handler, on all levels of a program.
  3575. A normal function definition may (as we all know) look like this:
  3576.  
  3577. PROC bla()
  3578.   /* ... */
  3579. ENDPROC
  3580.  
  3581. a function with an exception handler looks like this:
  3582.  
  3583. PROC bla() HANDLE
  3584.   /* ... */
  3585. EXCEPT
  3586.   /* ... */
  3587. ENDPROC
  3588.  
  3589. The block between PROC and EXCEPT is executed as normal, and if no
  3590. exception occurs, the block between EXCEPT and ENDPROC is skipped, and
  3591. the procedure is left at ENDPROC. If an exception is raised, either
  3592. in the PROC part, or in any function that is called in this block,
  3593. an exception handler is invoked.
  3594.  
  3595. 13B. using the Raise() function
  3596. -------------------------------
  3597. There are many ways to actually "raise" an exception, the simplest
  3598. is through the function Raise():
  3599.  
  3600.     Raise(exceptionID=0)
  3601.  
  3602. the exception ID is simply a constant that defines the type of
  3603. exception, and is used by handlers to determine what went wrong.
  3604. Example:
  3605.  
  3606. ENUM NOMEM,NOFILE  /* and others */
  3607.  
  3608. PROC bla() HANDLE
  3609.   DEF mem
  3610.   IF (mem:=New(10))=NIL THEN Raise(NOMEM)
  3611.   myfunc()
  3612. EXCEPT
  3613.   SELECT exception
  3614.     CASE NOMEM
  3615.       WriteF('No memory!\n')
  3616.     /* ... and others */
  3617.   ENDSELECT
  3618. ENDPROC
  3619.  
  3620. PROC myfunc()
  3621.   DEF mem
  3622.   IF (mem:=New(10))=NIL THEN Raise(NOMEM)
  3623. ENDPROC
  3624.  
  3625. The "exception" variable in the handler always contains the value of
  3626. the argument to the Raise() call that invoked it.
  3627. In both New() cases, the Raise() function invokes the handler of
  3628. function bla(), and then exits it correctly to the caller of bla().
  3629. If myfunc() had its own exception-handler, that one would be invoked
  3630. for the New() call in myfunc(). The scope of a handler is from the start
  3631. of the PROC in which it is defined until the EXCEPT keyword, including
  3632. all calls made from there.
  3633.  
  3634. This has three consequences:
  3635. A. handlers are organized in a recursive fashion, and which handler is
  3636.    actually invoked is dependant on which function calls which at runtime;
  3637. B. if an exception is raised within a handler, the handler of a lower
  3638.    level is invoked. This characteristic of handlers may be used
  3639.    to implement complex recursive resource allocation schemes with
  3640.    great ease, as we'll see shortly.
  3641. C. If an exception is raised on a level where no lower-level handler
  3642.    is available (or in a program that hasn't got any handlers at all),
  3643.    the program is terminated. (i.e: Raise(x) has the same effect as
  3644.    CleanUp(0))
  3645.  
  3646. other functions:
  3647.  
  3648.     Throw(exceptionID,value)
  3649.  
  3650. same as Raise(), only now it takes an arbitrary value with it. in
  3651. a handler one can then scrutinize this value with the variable
  3652. 'exceptioninfo'
  3653.  
  3654.     ReThrow()
  3655.  
  3656. has no args. simply does a Throw() on the current exception value,
  3657. IFF it is <>0.
  3658.  
  3659.  
  3660. 13C. defining exceptions for built-in functions (RAISE/IF)
  3661. ---------------------------------------------------------
  3662. With exceptions like before, we have made a major gain over the
  3663. old way of defining our own "error()" function, but still it is
  3664. a lot of typing to have to check for NIL with every call to New().
  3665.  
  3666. The E exception handling system allows for definition of exceptions
  3667. for all E functions (like New(), OpenW() etc.), and for all Library
  3668. functions (OpenLibrary(), AllocMem() etc.), even for those
  3669. included by modules. Syntax:
  3670.  
  3671. RAISE <exceptionId> IF <func> <comp> <value> , ...
  3672.  
  3673. the part after RAISE may be repeated with a ",".
  3674. Example:
  3675.  
  3676. RAISE NOMEM IF New()=NIL,
  3677.       NOLIBRARY IF OpenLibrary()=NIL
  3678.  
  3679. the first line says something like: "whenever a call to New() results
  3680. in NIL, automatically raise the NOMEM exception".
  3681. <comp> may be any of = <> > < >= <=
  3682. After this definition, we may write all through our programs:
  3683.  
  3684. mem:=New(size)
  3685.  
  3686. without having to write:
  3687.  
  3688. IF mem=NIL THEN Raise(NOMEM)
  3689.  
  3690. Note that the only difference is that 'mem' never gets any value
  3691. if the runtime system invokes the handler: code is generated for
  3692. every call to New() to check directly after New() returns and call
  3693. Raise() when necessary.
  3694.  
  3695. We'll now be implementing a small example that would be complex to solve
  3696. without exception handling: we call a function recursively, and in each
  3697. we allocate a resource (in this case memory), which we allocate before,
  3698. and release after the recursive call. What happens when somewhere high
  3699. in the recursion a severe error occurs, and we have to leave the program?
  3700. right: we would (in a conventional language) be unable to free all the
  3701. resources lower in the recursion while leaving the program, because all
  3702. pointers to those memory areas are stored in unreachable local variables.
  3703. In E, we can simply raise an exception, and from the end of the handler
  3704. again raise an exception, thus recursively calling all handlers and
  3705. releasing all resources. Example:
  3706.  
  3707.  
  3708. CONST SIZE=100000
  3709. ENUM NOMEM  /* ,... */
  3710.  
  3711. RAISE NOMEM IF AllocMem()=NIL
  3712.  
  3713. PROC main()
  3714.   alloc()
  3715. ENDPROC
  3716.  
  3717. PROC alloc() HANDLE
  3718.   DEF mem
  3719.   mem:=AllocMem(SIZE,0)        /* see how many blocks we can get */
  3720.   alloc()            /* do recursion */
  3721. EXCEPT DO
  3722.   IF mem THEN FreeMem(mem,SIZE)
  3723.   ReThrow()            /* recursively call all handlers */
  3724. ENDPROC
  3725.  
  3726.  
  3727. This is of course a simulation of a natural programming problem that
  3728. is usually far more complex, and thus the need for exception handling
  3729. becomes far more obvious. For a real-life example program whose error
  3730. handling would have become very difficult without exception
  3731. handlers, see the 'D.e' utility source.
  3732.  
  3733. The "DO" after an EXCEPT means that instead of jumping to ENDPROC,
  3734. the main code will simply continue execution in the handler as soon
  3735. as it gets there. it also sets exception to 0.
  3736. This is handy if you free resources local to a PROC in the handler.
  3737.  
  3738.  
  3739.  
  3740. 13D. use of exception-ID's
  3741. --------------------------
  3742. In real life an exception-ID is of course a normal 32-bit value,
  3743. and you may pass just about anything to an exception handler: for
  3744. example, some use it to pass error-description strings
  3745.  
  3746. Raise('Could not open "gadtools.library"!')
  3747.  
  3748. However, if you want to use exceptions in expandabele fashion and you
  3749. want to be able to use future modules that raise exceptions not defined
  3750. by your program, follow the following guidelines:
  3751.  
  3752. - Use and define ID 0 as "no error" (i.e. normal termination)
  3753.  
  3754. - For exceptions specific to your program, use the ID's 1-10000.
  3755.   Define these in the usual fashion with ENUM:
  3756.  
  3757.   ENUM OK,NOMEM,NOFILE,...
  3758.  
  3759.   (OK will be 0, and others will be 1+)
  3760.  
  3761. - ID's 12336 to 2054847098 (these are all identifiers
  3762.   consisting of upper/lowercase letters and digits of length 2,3 or 4
  3763.   enclosed in "") are reserved as common exceptions. A common exception
  3764.   is an exception that need not be defined in your program, and that
  3765.   may be used by implementors of modules (with functions in them) to
  3766.   raise exceptions: for example, if you design a set of procedures that
  3767.   perform a certain task, you may want to raise exceptions. As you would
  3768.   want to use those functions in various programs, it would be
  3769.   unpractical to have to coordinate the IDs with the main program,
  3770.   furthermore, if you use more than one set of functions (in a module,
  3771.   in the future) and every module would have a different ID for
  3772.   'no memory!', things could get out of hand.
  3773.   This is where common exceptions come in: the common out-of-memory
  3774.   ID is "MEM" (including the quotes): any implementor can now simply
  3775.  
  3776.   Raise("MEM")
  3777.  
  3778.   from all different procedures, and the programmer that uses the module
  3779.   only needs to suply an exception handler that understands "MEM"
  3780.  
  3781.   future modules that contain sets of functions will specify what
  3782.   exception a certain procedure may raise, and if these overlap
  3783.   with the IDs of other procedures, the task of the programmer
  3784.   that has to deal with the exceptions will be greatly simplified.
  3785.  
  3786.   examples:
  3787.  
  3788.   (system)
  3789.  
  3790.   "MEM"        out of memory
  3791.   "FLOW"    (nearly) stack overflow
  3792.   "STCK"    garbage collector has stack problems
  3793.   "^C"        Control-C break
  3794.   "ARGS"    bad args
  3795.  
  3796.   (exec/libraries)
  3797.  
  3798.   "SIG"        could not allocate signal
  3799.   "PORT"    could not create messageport
  3800.   "LIB"        library not available
  3801.   "ASL"        no asl.library
  3802.   "UTIL"    no utility.library
  3803.   "LOC"        no locale.library
  3804.   "REQ"        no req.library
  3805.   "RT"        no reqtools.library
  3806.   "GT"        no gadtools.library (similar for others)
  3807.  
  3808.   (intuition/gadtools/asl/gfx)
  3809.  
  3810.   "WIN"        failed to open window
  3811.   "SCR"        failed to open screen
  3812.   "REQ"        could not open requester
  3813.   "FREQ"    could not open filerequester
  3814.   "GAD"        could not create gadget
  3815.   "MENU"    could not create menu(s)
  3816.   "FONT"    problem getting font
  3817.  
  3818.   (dos)
  3819.  
  3820.   "OPEN"    could not open a file / file does not exist
  3821.   "OUT"        problems while writing
  3822.   "IN"        problems while reading
  3823.   "EOF"        unexpected end of file
  3824.   "FORM"    input format error
  3825.   "SEG"        loadseg problems
  3826.  
  3827.   The general tendency is:
  3828.   * all uppercase for general system exceptions,
  3829.   * mixed case for exceptions used by >1 app, but not general enough.
  3830.   * all lowercase for exceptions raised within your own
  3831.     multi-module application
  3832.  
  3833. - all others (including all negative IDs) remain reserved.
  3834.  
  3835.  
  3836. +---------------------------------------------------------------+
  3837. |                      14. OO PROGRAMMING            |
  3838. +---------------------------------------------------------------+
  3839.  
  3840. 14A. OO features in E
  3841. ---------------------
  3842. The features descibed here in this chapter are grouped as such
  3843. since they constitute what is generally seen as the three essential
  3844. main components that make a language 'Object Oriented' (i.e.
  3845. inheritance - data hiding - polymorhism). However in E they are
  3846. by no means a 'separate chapter' since each can be used in any
  3847. way with other E features.
  3848.  
  3849.  
  3850. 14B. object inheritance
  3851. -----------------------
  3852. it's always annoying not being able to express dependencies between
  3853. OBJECTs, or reuse code that works on a particular OBJECT with a bigger
  3854. OBJECT that encapsulates the first. Object Inheritance allows you
  3855. to do just that in E. when you have an object a:
  3856.  
  3857. OBJECT a
  3858.   next, index, term
  3859. ENDOBJECT
  3860.  
  3861. you can make a new object b that has the same properties
  3862. as a (and is compatible with code for a):
  3863.  
  3864. OBJECT b OF a
  3865.   bla, x, burp
  3866. ENDOBJECT
  3867.  
  3868. is equivalent to:
  3869.  
  3870. OBJECT b
  3871.   next, index, term         /* from a */
  3872.   bla, x, burp
  3873. ENDOBJECT
  3874.  
  3875. with DEF p:b, you can directly not only access p.bla as usual,
  3876. but also p.next.
  3877.  
  3878. as an example, if one would have a module with an OBJECT to
  3879. implement a certain datatype (for example a doubly-linked-list),
  3880. and PROCs to support it, one could simply inherit from it, adding
  3881. own data to the object, and use the _existing_ functions to
  3882. manipulate the list. However, it's only in combination with
  3883. methods (descibed below), inheritance can show its real power.
  3884.  
  3885.  
  3886. 14C. data hiding (EXPORT/PRIVATE/PUBLIC)
  3887. ----------------------------------------
  3888. E has a very handy data-hiding mechanism. Other languages, like C++,
  3889. use data-hiding on classes, which raises the need for kludges (like
  3890. 'friends'), and makes datahiding insecure (Eiffel). E's datahiding
  3891. works on the module-level, which can model class-level datahiding,
  3892. but enables more intelligent schemes also.
  3893.  
  3894. PRIVATE and PUBLIC let you declare a section of an object as visible
  3895. to the outer world or not; the outer world here is all code outside
  3896. the module. for the code within a module, everything is always visible.
  3897. example:
  3898.  
  3899.  
  3900. OBJECT mydata PRIVATE                   -> whole object is private
  3901.   bla:PTR TO mydata, burp, grrr:INT
  3902. ENDOBJECT
  3903.  
  3904. OBJECT aaargh
  3905.   blerk:PTR TO aaargh                   -> public
  3906. PRIVATE
  3907.   x:INT, y:INT, z:INT                   -> private
  3908. PUBLIC
  3909.   hmpf[10]:ARRAY OF mydata              -> public again
  3910. ENDOBJECT
  3911.  
  3912.  
  3913. an object is by default public, an occurring PRIVATE or PUBLIC
  3914. acts as a toggle-switch to the objects current visibility. In the
  3915. first object, all is private. The second object has only (x,y,z)
  3916. as private. PRIVATE and PUBLIC keywords may occur:
  3917. - in the object header line
  3918. - as a line on itself in the object-def
  3919. - preceding decls in an object-def
  3920. (i.e virtually anywhere)
  3921.  
  3922. Why datahiding?
  3923. If you want to know why datahiding is a good technique, you'd
  3924. probably want to read a good book on OO. But in short: it is
  3925. generally assumed that lots of problems in maintaining and
  3926. enhancing large pieces of software is the fact that it's hard to change
  3927. things because lots of code start to depend on certain structures
  3928. in your program. if you datahide an object, only the code within a
  3929. module will rely on the format of objects, and you can easily change
  3930. both representation of an object (for example changing a stack
  3931. implementation from ARRAY to a linked list) and the code that
  3932. works with it. If a lot of code of a large app depend on the fact
  3933. that the stack is an ARRAY, you won't be able to simply change
  3934. it, which will lead to kludges. In general, try to datahide as
  3935. much as possible without becoming too restrictive on the use
  3936. of your object. Using methods (below) will often enable you to
  3937. keep the whole object private.
  3938.  
  3939.  
  3940. 14D. methods and virtual methods
  3941. --------------------------------
  3942. A method is much like a PROC, only now it's part of an OBJECT. It
  3943. also allows you to exploit Polymorhism on objects, as we'll see
  3944. below. definition of a method:
  3945.  
  3946.  
  3947. OBJECT blerk PRIVATE
  3948.   x:PTR TO blerk, y:INT, z
  3949. ENDOBJECT
  3950.  
  3951. PROC getx() OF blerk IS self.x
  3952.  
  3953.  
  3954. the 'OF blerk' part tells the compiler it belongs to the object
  3955. 'blerk'. Note that apart from the 'OF' the syntax is completely
  3956. like a 'PROC', however, it can't be invoked as one, and also
  3957. functions quite differently.
  3958.  
  3959. 'self' is a local variable that is available in every method, and
  3960. is a pointer to the object that the method belongs to (in this
  3961. case 'self:PTR TO blerk'). This function just returns the value
  3962. of the x field of blerk, which actually makes sense, given that
  3963. this allows you to later change whatever x represents.
  3964.  
  3965. we may call methods similar to object selections ".":
  3966.  
  3967.  
  3968. DEF a:PTR TO blerk
  3969. NEW a
  3970. ...
  3971. a.getx()           -> invoke method getx() on object a
  3972.  
  3973.  
  3974. in this example, upon invocation `a' becomes the value of `self'
  3975. during the execution of getx().
  3976.  
  3977. so far the use of methods has been nice, but hasn't show us its
  3978. real power, which only comes when used with inheritance.
  3979.  
  3980. If I inherit an object that has methods, I automatically get
  3981. those in the new object:
  3982.  
  3983.  
  3984. OBJECT burp OF blerk PRIVATE        -> same as blerk, + extra field
  3985.   prut:INT
  3986. ENDOBJECT
  3987.  
  3988. DEF b:PTR TO burp
  3989. NEW b
  3990. ...
  3991. b.getx()                            -> same method
  3992.  
  3993.  
  3994. The interesting thing is now, that instead of inheriting a method,
  3995. you may also redefine it:
  3996.  
  3997.  
  3998. PROC getx() OF burp IS self.x+1
  3999.  
  4000.  
  4001. (it goes without saying that we may also add new methods)
  4002. so where appropriate, we can choose to modify slightly the
  4003. behaviour of methods we get from other objects, while the
  4004. interface to it (i.e. 'getx()') stays the same. Not only
  4005. does this allow us to reuse code selectively, we can also make use
  4006. of polymorhism:
  4007.  
  4008.  
  4009. PROC dosomething(o:PTR TO blerk)
  4010.   ...
  4011.   o.getx()
  4012.   ...
  4013. ENDPROC
  4014.  
  4015. dosomething(a)
  4016. dosomething(b)
  4017.  
  4018.  
  4019. we may call that PROC with both a and b, since both are compatible
  4020. with a blerk object. But which of the two method implementations of
  4021. getx() is invoked at o.getx()? Answer: both are. Method calls in E
  4022. are what virtual method calls are in other languages: they dynamically
  4023. act on the real type of an object (o) and call the appropriate method.
  4024.  
  4025. A more clear example:
  4026.  
  4027.  
  4028. -> classical OO polymorphic example
  4029.  
  4030. OBJECT loc
  4031.   PRIVATE xpos:INT, ypos:INT
  4032. ENDOBJECT
  4033.  
  4034. OBJECT point OF loc
  4035.   PRIVATE colour:INT
  4036. ENDOBJECT
  4037.  
  4038. OBJECT circle OF point
  4039.   PRIVATE radius:INT
  4040. ENDOBJECT
  4041.  
  4042. PROC show() OF loc IS WriteF('I''m a Location!\n')
  4043. PROC show() OF point IS WriteF('I''m a Point!\n')
  4044. PROC show() OF circle IS WriteF('I''m a Circle!\n')
  4045.  
  4046. PROC main()
  4047.   DEF x:PTR TO loc,l:PTR TO loc,p:PTR TO point,c:PTR TO circle
  4048.   ForAll({x},[NEW l,NEW p,NEW c],`x.show())
  4049. ENDPROC
  4050.  
  4051.  
  4052. In the above, x is a PTR TO loc, so many would expect x.show() to
  4053. write 'I'm a Location' three times, but instead it writes the
  4054. right string for each object.
  4055.  
  4056. If one would write this example in a non-OO language, one would need
  4057. a SELECT for every operation like show(), testing some value
  4058. present in the object to see what it is. If I would add a new shape
  4059. to this, say:
  4060.  
  4061. OBJECT ellipse OF circle
  4062.  
  4063. I would need to change all SELECTs throughout my app to account for
  4064. it. With object-polymorhism, I can just write a show() method, and
  4065. ALL code throughout my app that calls x.show() will act correctly
  4066. when x is a PTR TO ellipse, even without recompilation!
  4067.  
  4068.  
  4069. It's difficult to show why this is powerful in a few examples, and
  4070. best to discover this is using it in real life apps. and: like I said,
  4071. read a book on it.
  4072.  
  4073.  
  4074. How does polymorphism work?
  4075. In the above examples, it's clear the compiler can't know
  4076. what method it's going to call. that's why E uses a 'class
  4077. object', and every object created gets a ptr to this object.
  4078. In the class object, all information is stored that is common
  4079. for all objects of that type, such as pointers to methods.
  4080. when the E compiler sees a call like x.show(), instead of
  4081. looking directly at the show() that belongs to the type of
  4082. x (i.e. loc), it will generate code to retrieve the pointer
  4083. to the show() method from loc's class object. since the
  4084. class object for point looks the same as loc (only maybe
  4085. slightly larger), that code will automatically call point's
  4086. show(), when x is really a point object. This is sometimes
  4087. called runtime binding.
  4088.  
  4089. Objects that have methods therefore always are 4 bytes larger
  4090. than you expect them to be, since they contain a class object
  4091. pointer. This pointer is automatically installed by NEW, which
  4092. is the reason _currently_ NEW is the only way to create such
  4093. an object.
  4094.  
  4095. If a method is declared with the sole purpose of enabling
  4096. subclasses to redefine it (this type of class is known as
  4097. a virtual baseclass in some languages), one may use EMPTY:
  4098.  
  4099. PROC bla() OF obj IS EMPTY
  4100.  
  4101. it may then be redefined in subclasses. Since a programmer
  4102. might not implement all methods at once, it is not an error
  4103. when the above method is executed. it will just return 0 or NIL.
  4104.  
  4105.  
  4106. One may effectively add methods to system OBJECTs:
  4107.  
  4108.     OBJECT mygadget OF gadget    -> from intuition!
  4109.       -> extra fields here
  4110.     ENDOBJECT
  4111.  
  4112.     PROC creategadget() OF mygadget IS ...
  4113.  
  4114. A pointer to an object such as mygadget above is then compatible
  4115. with a normal gadget pointer, i.e. it may be added directly to a
  4116. window etc.
  4117.  
  4118.  
  4119. 14E. Constructors, Destructors and Super-Methods
  4120. ------------------------------------------------
  4121.  
  4122. The constructor name may be anything, but it is usually given the same name
  4123. as the class. One may even have multiple constructors for one class.
  4124. A constructor is called directly on the object created with NEW:
  4125.  
  4126.     NEW obj.stack()
  4127.  
  4128. Destructors however have to be named "end". An object is destroyed like this:
  4129.  
  4130.     END obj
  4131.  
  4132. If 'obj' has a .end() method, it is automatically called. end() shouldn't have
  4133. any arguments, and it is of no use returning a value. (see 5M for a desciption
  4134. of END's precise functioning).
  4135.  
  4136.  
  4137. The super-method of a method is the method by the same name of its super
  4138. class. Sometimes it's handy to call this method because you might want to
  4139. add its behaviour to the implementation of your class, however, since
  4140. you've redefined it, calling the super-method by that name will just
  4141. call yourself (!). The SUPER keyword allows you to call any method of your
  4142. superclass (or someone else's superclass):
  4143.  
  4144.     SUPER obj.method()
  4145.  
  4146. This piece of code above can be used as expression and statement.
  4147. Care has to be taken though, since if your supermethod calls another
  4148. method of that object, it will call the redefined version, not the
  4149. one at its own 'level', so to speak (generally this is what one wants).
  4150. Also, the compiler looks at the static type of 'obj' to find the
  4151. superclass, not the dynamic type (though it may still have that behaviour).
  4152.  
  4153.  
  4154. +---------------------------------------------------------------+
  4155. |                      15. INLINE ASSEMBLY            |
  4156. +---------------------------------------------------------------+
  4157.  
  4158. 15A. identifier sharing
  4159. -----------------------
  4160. As you've probably guessed from the example in chapter 5D, assembly
  4161. instructions may be freely mixed with E code. The big secret is, that
  4162. a complete assembler has been built in to the compiler.
  4163. Apart from normal assembly addressing modes, you may use the following
  4164. identifiers from E:
  4165.  
  4166. mylabel:
  4167. LEA mylabel(PC),A1        /* labels */
  4168.  
  4169. DEF a                /* variables */
  4170. MOVE.L (A0)+,a            /* note that <var> is <offset>(A4) (or A5) */
  4171.  
  4172. MOVE.L dosbase,A6        /* library call identifiers */
  4173. JSR    Output(A6)
  4174.  
  4175. MOVEQ  #TRUE,D0            /* constants */
  4176.  
  4177.  
  4178. EC's assembler supports following constructs,
  4179.  
  4180. where
  4181. n    = registernum
  4182. x    = index
  4183. lab    = label, from: "label:" or "PROC label()"
  4184. abs    = absolute addressing
  4185. s    = size. L, W or B where appropriate.
  4186.  
  4187. - addressing modes supported by EC:
  4188.  
  4189.   Dn, An, (An), (An)+, -(An), x(An), x(An,Dn.s),
  4190.   lab(PC), lab(PC,Dn.s), abs, abs.W
  4191.  
  4192.   (note: write abs.W in hexadecimal, to not confuse it with a float
  4193.    value, i.e. write   MOVE.L $4.W,A6   )
  4194.  
  4195. - supported partially:
  4196.  
  4197.   #<constexp>
  4198.  
  4199. - not supported:
  4200.  
  4201.   lab (same as abs), #lab
  4202.   use LEA lab(PC),An instead.
  4203.  
  4204. - extra modes:
  4205.  
  4206.   var.s (transfers contents of var. optionally size is ".W" or ".B",
  4207.          default is ".L")
  4208.  
  4209.   LibraryFunction(A6)
  4210.  
  4211.   example:
  4212.  
  4213.   ...
  4214.   MOVE.W myvar.W,D0     -> move lowword of 'myvar'
  4215.   ...
  4216.   MOVE.L dosbase,A6
  4217.   JSR    Write(A6)
  4218.  
  4219.  
  4220.  
  4221. As an extra, E allows to directly return registers from a function:
  4222.  
  4223.   ENDPROC D0
  4224.  
  4225. You may even interpret this as multiple return values, i.e. D0/D1/D2.
  4226.  
  4227.  
  4228. 15B. the inline assembler compared to a macro assembler
  4229. -------------------------------------------------------
  4230. The inline assembler differs somewhat from your average macro-assembler,
  4231. and this is caused mainly by the fact that it is an extension to E,
  4232. and thus it obeys E-syntax. Main differences:
  4233.  
  4234. - comments are with /* */ and not with ";", they have a different meaning.
  4235. - keywords and registers are in uppercase, everything is case sensitive
  4236. - no macros and other luxury assembler stuff (well, there's the complete
  4237.   E language to make up for that ...)
  4238. - You should be aware that registers A4/A5 may not be trashed by inline
  4239.   assembly code, as these are used by E code. Also, if your code
  4240.   can be called by code that is register-allocated, you should preserve
  4241.   D3-D7. an instruction like
  4242.  
  4243.     MOVEM.L D3-D7,-(A7); /* inline asm */; MOVEM.L (A7)+,D3-D7
  4244.  
  4245.   should help if problems occur.
  4246. - no support for LARGE model/reloc-hunks in assembly _YET_.
  4247.   This means practically that you have to use (PC)-relative addressing
  4248.   for now (which is faster anyway).
  4249.  
  4250.  
  4251. 15C. ways using binary data (INCBIN/CHAR..)
  4252. -------------------------------------------
  4253.  
  4254. INCBIN
  4255.  
  4256. syntax:        INCBIN <filename>
  4257.  
  4258. includes a binary file at the exact spot of the statement, should
  4259. therefore be separate from the code. Example:
  4260.  
  4261. mytab: INCBIN 'df1:data/blabla.bin'
  4262.  
  4263. LONG, INT, CHAR
  4264.  
  4265. syntax:        LONG <values>,...
  4266.         INT <values>,...
  4267.         CHAR <values>,...
  4268.  
  4269. Allows you to place binary data directly in your program. Functions much
  4270. like DC.x in assembly. Note that the CHAR statement also takes strings,
  4271. and will always be aligned to an even word-boundary. Example:
  4272.  
  4273. mydata: LONG 1,2; CHAR 3,4,'hi folks!',0,1
  4274.  
  4275.  
  4276. 15D. OPT ASM
  4277. ------------
  4278. OPT ASM is discussed also in chapter 16A. It allows you to operate
  4279. 'EC' as an assembler. There's no good reason to use EC over some
  4280. macro-assembler, except that it is significantly faster than for example
  4281. A68k, equals DevPac and loses of AsmOne (sob 8-{). You will also have
  4282. a hard time trying to squeeze your disks of old seka-sources through EC,
  4283. because of the differences as described in chapter 15B. If you want to write
  4284. assembly programs with EC, and want to keep your sources compatible with
  4285. other assemblers, simply precede all E-specific elements with a ";",
  4286. EC will use them, and any other assembler will see them as a comment.
  4287. Start all regular comments with a smiley (";->").
  4288. Example:
  4289.  
  4290. ; OPT ASM
  4291.  
  4292. start:    MOVEQ    #1,D0        ;-> do something silly
  4293.     RTS            ;-> and exit
  4294.  
  4295. this will be assembled by any assembler, including EC
  4296.  
  4297.  
  4298. 15E. Inline asm and register variables
  4299. ---------------------------------------
  4300. register variables are a great companion to inline assembly, as
  4301. they function just as registers, but at the same time have clear
  4302. identifiers instead of Dx, and also are automatically saved and
  4303. restored by E code. example:
  4304.  
  4305. PROC bla()
  4306.   DEF count:REG
  4307.   MOVEQ #10,count
  4308. loop: WriteF('count=\d\n',count)
  4309.   DBRA count,loop
  4310. ENDPROC
  4311.  
  4312. all instruction that can work with a Dx EA, work with register
  4313. variables. examples:
  4314.  
  4315. MOVEQ #1,a
  4316. MOVEM.L D0/D1/a/b/A0,-(A7)
  4317. LSL.L a,b
  4318.  
  4319. etc.
  4320.  
  4321. as may be known, EC uses D3-D7 for these register variables. If you wish
  4322. to write code that freely mixes assembly with E, it's advisable to
  4323. keep longer-term values in register variables, and temporaries in
  4324. D0-D2/A0-A3/A6
  4325.  
  4326. +---------------------------------------------------------------+
  4327. |            16. TECHNICAL AND IMPLEMENTATION ISSUES        |
  4328. +---------------------------------------------------------------+
  4329.  
  4330. 16A. the OPT keyword
  4331. --------------------
  4332.  
  4333. OPT, LARGE, STACK, ASM, NOWARN, DIR, OSVERSION, MODULE, EXPORT, RTD, REG
  4334.  
  4335. syntax:        OPT <options>,...
  4336.  
  4337. allows you to change some compiler settings:
  4338.  
  4339. LARGE        Sets code and data model to large. Default is small;
  4340.         the compiler generates mostly pc-relative code, with a
  4341.         max-size of 32k. With LARGE, there are no such limits,
  4342.         and reloc-hunks are generated (see 0D, LARGE).
  4343. STACK=x        Set stacksize to x bytes yourself. Only if you know what
  4344.         you are doing. Normally the compiler makes a very good
  4345.         guess itself at the required stack space (see 16C).
  4346. ASM        Set the compiler to assembly mode. From there on, only
  4347.         assembly instructions are allowed, and no initialisation
  4348.         code is generated. (see 15D, inline assembly)
  4349. NOWARN        Shut down warnings. The compiler will warn you if it
  4350.         *thinks* your program is incorrect, but still syntactically
  4351.         ok. (see 0D, -n)
  4352. DIR=moduledir    Sets the directory where the compiler searches for modules.
  4353.         default='emodules:'
  4354. OSVERSION=vers    Default=33 (v1.2). Sets the minimum version of the kickstart
  4355.         (like 37 for v2.04) your program runs on. That way, your
  4356.         program simply fails while the dos.library is being opened
  4357.         in the initialisation code when running on an older machine.
  4358.         However, checking the version yourself and giving an
  4359.         appropriate error-message is more helpful for the user.
  4360. MODULE        denotes this source to be a module. (see 10C)
  4361. EXPORT        automatically export all declarations in a module
  4362. RTD        generates RTD's instead of RTS in the main source.
  4363.         020+ only. [experimental optimisation]
  4364. 020,881,040    generate code for these CPUs. not really usable yet.
  4365. REG=n        use n register for register-allocation.
  4366.  
  4367. example:
  4368.  
  4369. OPT STACK=20000,NOWARN,DIR='df1:modules',OSVERSION=39,REG=3
  4370.  
  4371.  
  4372. 16B. small/large model
  4373. ----------------------
  4374. Amiga E lets you choose between SMALL and LARGE code/data model.
  4375. Note that most of the programs you'll write (especially if you just
  4376. started with E) will fit into 32k when compiled: you won't have to
  4377. bother setting some code-generation model. You'll recognise the
  4378. need for LARGE model as soon as EC starts complaining that it can't
  4379. squeeze your code into 32k anymore. To compile a source with LARGE model:
  4380.  
  4381. 1> ec -l sizy.e
  4382.  
  4383. or better yet, put the statement
  4384.  
  4385. OPT LARGE
  4386.  
  4387. at the top of your code.
  4388.  
  4389.  
  4390. 16C. stack organisation
  4391. -----------------------
  4392. To store all local and global variables, the run-time system of an
  4393. executable generated by Amiga E allocates a chunk of memory,
  4394. from which it takes some fixed part to store all global variables.
  4395. The rest will be dynamically used as functions get called.
  4396. as a function is called in E, space on the stack is reserved
  4397. to store all local data, which is released upon exit of the function.
  4398. That is why having large arrays of local data can be dangerous when
  4399. used recursively: all data of previous calls to the same function
  4400. still resides on the stack and eats up large parts of the free stack
  4401. space. However, if PROCs are called in a linear fashion, there's
  4402. no way the stack will overflow.
  4403. Example:
  4404.  
  4405. global data:        10k (arrays etc.)
  4406. local data PROC #1:     1k
  4407. local data PROC #1:     3k
  4408.  
  4409. the runtime system always reserves an extra 10k over this for normal
  4410. recursion (for example with small local-arrays) and additional buffers/
  4411. system spaces, thus will allocate a total of 24k stack space
  4412.  
  4413.  
  4414. 16D. hardcoded limits
  4415. ---------------------
  4416.  
  4417. Note these signs: (+-)    just about, depends on situation,
  4418.                   (n.l.)  no clear limit, but this seems reasonable.
  4419.  
  4420. --------------------------------------------------------------------------
  4421. OBJECT/ITEM                    SIZE/AMOUNT/MAX
  4422. --------------------------------------------------------------------------
  4423.  
  4424. value datatype CHAR                0 .. 255
  4425. value datatype INT                -32 k .. +32 k
  4426. value datatype LONG/PTR                -2 gig .. +2 gig
  4427.  
  4428. identifierlength                100 bytes (n.l.)
  4429. length of one source line            2000 lexical tokens (+-)
  4430. source length                    2 gig (theoretically)
  4431. constant lists                    few hundred elements (+-)
  4432. constant strings                1000 chars (n.l.)
  4433. max. nesting depth of loops (IF, FOR etc.)    500 deep
  4434. max. nesting depth of comments            infinite
  4435.  
  4436. #of local variables per procedure        8000
  4437. #of global variables                7500
  4438. #of arguments to own functions            8000 (together with locals)
  4439. #of arguments to E-varargs functions (WriteF())    64 (v2.1) / 1024 (v2.5)
  4440.  
  4441. one object (allocated local/global or dyn.)    8 k
  4442. one array, list or string (local or global)    32 k
  4443. one string (dynamically)            32 k
  4444. one list (dynamically)                128 k
  4445. one array (dynamically)                2 gig
  4446. objects with NEW                64k elem.
  4447. CHAR/INT/LONG with NEW                2 gig.
  4448.  
  4449. local data per procedure            250 meg
  4450. global data                    250 meg
  4451.  
  4452. code size of one procedure            32 k
  4453. code size of executable                32 k SMALL, 2 gig LARGE model
  4454. current practical limit (may extend in future)    2-5 meg (v2.1) / 10 meg (v2.5)
  4455.  
  4456. buffersize of generated code and identifiers    relative to source
  4457. buffersize of labels/branches and intermediate    independently (re)allocated
  4458.  
  4459.  
  4460.  
  4461. 16E. error messages, warnings and the unreferenced check
  4462. --------------------------------------------------------
  4463. Sometimes, when compiling your source with EC, you get a message
  4464. of the sort UNREFERENCED: <ident>, <ident>, ...
  4465. This is the case when you have declared variables, functions or labels,
  4466. but did not use them. This is an extra service rendered to you by the
  4467. compiler to help you find out about those hard to find errors.
  4468.  
  4469. There are several warnings that the compiler issues to notify you that
  4470. something might be wrong, but is not really an error.
  4471.  
  4472.  
  4473. - "A4/A5 used in inline assembly"
  4474.   This is the warning you'll get if you use registers A4 or A5 in your
  4475.   assembly code. The reason for this is that those registers are used
  4476.   internally by E to address the global and local variables respectively.
  4477.   Of course there might be a good reason to use these, like doing
  4478.   a MOVEM.L A4/A5,-(A7) before a large part of inline assembly code
  4479.  
  4480. - "keep an eye on your stacksize"
  4481. - "stack is definitely too small"
  4482.   Both these may be issued when you use OPT STACK=<size>. The compiler
  4483.   will simply match your <size> against its own estimate (see 16C),
  4484.   and issue the former warning if it thinks it's ok but a bit on the small
  4485.   side, and the latter if it's probably too small.
  4486.  
  4487. - 'suspicious use of "=" in void expressions (s). (line %d)'
  4488.   This warning is issued if you write expressions like 'a=1' as a
  4489.   statement. One reason for this is the fact that a comparison doesn't
  4490.   make much sense as a statement, but the main reason is that it could be
  4491.   an often occurring typo for 'a:=1'. Forgetting those ":" may be hard to
  4492.   find, and it may have disastrous consequences.
  4493.  
  4494. - 'module changed OPT settings'
  4495.   If you use a module that has OPT OSVERSION=37, this changes the
  4496.   OPT for the main program too. this warning serves to make you aware
  4497.   of this. put such an OPT in the main program too to get rid of it.
  4498.  
  4499. - 'variable used as function'
  4500.   in v3, arbitrary variables may be used as function. this function
  4501.   is there to warn you so you don't accidentally do this.
  4502.  
  4503. - 'code outside PROCs'
  4504.   You wrote E code in between PROCs, which is only rarely useful.
  4505.  
  4506. Errors.
  4507. The compiler will print the source-code-line that caused the error
  4508. below it, with a cursor at the exact spot. The cursor denotes the spot
  4509. the compiler was when it _discovered_ the error, it is thus likely
  4510. that the symbol that caused the error is the one just _before_ the
  4511. cursor.
  4512.  
  4513. - 'syntax error'
  4514.   Most common error. This error is issued either when no other
  4515.   error is appropriate or your way of ordering code in your sources
  4516.   is too abnormal.
  4517.  
  4518. - 'unknown keyword/const'
  4519.   You have used an identifier in uppercase (like "IF" or "TRUE"), and
  4520.   the compiler could not find a definition for it. Causes:
  4521.   * mispelled keyword
  4522.   * you used a constant, but forgot to define it in a CONST statement
  4523.   * you forgot to specify the module where your constant is defined
  4524.  
  4525. - '":=" expected'
  4526.   You have written a FOR statement or an assignment, and put something
  4527.   other than ":=" in its place.
  4528.  
  4529. - 'unexpected characters in line'
  4530.   You used characters that have no syntactic meaning in E outside of
  4531.   a string. examples: "@!&\~"
  4532.  
  4533. - 'label expected'
  4534.   At some places, for example after the PROC or JUMP keyword,
  4535.   a label identifier is required. You wrote something else.
  4536.  
  4537. - '"," expected'
  4538.   In specifying a list of items (for example a parameter list)
  4539.   you wrote something else instead of a comma.
  4540.  
  4541. - 'variable expected'
  4542.   This construction requires a variable, example:
  4543.   FOR <var>:= ... etc.
  4544.  
  4545. - 'value does not fit in 32 bit'
  4546.   In specifying a constant value (see 2A-2E) you wrote too
  4547.   large a number, examples:  $FFFFFFFFF, "abcdef".
  4548.   Also occurs when you define a SET of more than 32 elements.
  4549.  
  4550. - 'missing apostrophe/quote'
  4551.   You forgot the ' at the other end of a string.
  4552.  
  4553. - 'incoherent program structure'
  4554.   * you started a new PROC before ending the last one
  4555.   * you don't nest your loops properly, for example:
  4556.     FOR
  4557.       IF
  4558.       ENDFOR
  4559.     ENDIF
  4560.  
  4561. - 'illegal command-line option'
  4562.   In specifying 'EC -opt source' you wrote something for '-opt'
  4563.   that is not a legal option to EC.
  4564.  
  4565. - 'division and multiplication 16bit only'
  4566.   The compiler detected that you were about to use 32bits
  4567.   for * or /. This would not have the desired result at runtime.
  4568.   (see 9G, Mul() and Div()).
  4569.  
  4570. - 'superfluous items in expression/statement'
  4571.   After the compiler already compiled your statement, it still found
  4572.   lexical tokens instead of an end of line. You probably forgot
  4573.   the <lf> or ";" to separate two statements.
  4574.  
  4575. - 'procedure "main" not available'
  4576.   Your program does not include a main procedure !
  4577.  
  4578. - 'double declaration of label'
  4579.   You declared a label twice, for example:
  4580.   label:
  4581.   PROC label()
  4582.  
  4583. - 'unsafe use of "*" or "/"'
  4584.   This again has to do with 16bit instead of 32bit * and /.
  4585.   See 'division and multiplication 16bit only'.
  4586.  
  4587. - "reading sourcefile didn't succeed"
  4588.   Check your source spec. that you gave with 'ec mysource'
  4589.   make sure the file ends in '.e'
  4590.  
  4591. - "writing executable didn't succeed"
  4592.   Trying to write the generated code as an executable caused a dos
  4593.   error. For example, the executable that did already exist could
  4594.   not be overwritten.
  4595.  
  4596. - 'no args'
  4597.   "USAGE: ec [-opts] <sourcecodefilename> (`.e' is added)"
  4598.   You get this by just typing 'ec' without any arguments.
  4599.  
  4600. - 'unknown/illegal addressing mode'
  4601.   This error is reported only by the inline assembler. Possible causes are:
  4602.   * you used some addressing mode that does not exist on the 68000
  4603.   * the addressing mode exists, but not for this instruction.
  4604.     not all assembly instructions support all combinations of
  4605.     effective addresses for source and destination.
  4606.  
  4607. - 'unmatched parentheses'
  4608.   Your statement has more "(" than ")" or the other way around
  4609.  
  4610. - 'double declaration'
  4611.   One identifier is used in two or more declarations.
  4612.  
  4613. - 'unknown identifier'
  4614.   An identifier is not used in any declaration; it is unknown.
  4615.   You probably forgot to put it in a DEF statement.
  4616.  
  4617. - 'incorrect #of args or use of ()'
  4618.   * You forgot to put "(" or ")" at the right spot
  4619.   * you supplied the incorrect #of arguments to some function
  4620.  
  4621. - 'unknown e/library function'
  4622.   You wrote an identifier with the first character in uppercase, and
  4623.   the second in lowercase, but the compiler could not find a definition.
  4624.   Possible causes:
  4625.   * Misspelled name of function
  4626.   * You forgot to include the module that defines this library call.
  4627.  
  4628. - 'illegal function call'
  4629.   Rarely occurs. You get this one if you try to construct weird
  4630.   function calls like nested WriteF()'s. Example:
  4631.   WriteF(WriteF('hi!'))
  4632.  
  4633. - 'unknown format code following "\"'
  4634.   You specified a format code in a string which is illegal.
  4635.   (see 2F for a listing of format codes)
  4636.  
  4637. - '/* not properly nested comment structure */'
  4638.   The #of '/*' is unequal to the #of '*/', or is placed in a funny order.
  4639.  
  4640. - 'could not load binary'
  4641.   <filespec> in INCBIN <filespec> could not be read.
  4642.  
  4643. - '"}" expected'
  4644.   You started an expression with "{<var>" , but forgot the "}"
  4645.  
  4646. - 'immediate value expected'
  4647.   Some constructions require an immediate value instead of an expression.
  4648.   Example:
  4649.   DEF s[x*y]:STRING   /* wrong: only something like s[100]:STRING is legal */
  4650.  
  4651. - 'incorrect size of value'
  4652.   You specified an unacceptably large (or small) value for some construction.
  4653.   Examples:
  4654.   DEF s[-1]:STRING, t[1000000]:STRING    /* needs to be 0..32000  */
  4655.   MOVEQ #1000,D2                         /* needs to be -128..127 */
  4656.  
  4657. - 'no e code allowed in assembly modus'
  4658.   You wish to operate the compiler as an assembler by writing 'OPT ASM',
  4659.   but, by accident, wrote some E code.
  4660.  
  4661. - 'illegal/inappropriate type'
  4662.   At someplace where a <type> spec. was needed, you wrote something
  4663.   inappropriate. Examples:
  4664.   DEF a:PTR TO ARRAY       /* no such type */
  4665.   [1,2,3]:STRING
  4666.  
  4667. - '"]" expected'
  4668.   You started with "[", but never ended with "]"
  4669.  
  4670. - 'statement out of local/global scope'
  4671.   A breakpoint of scope is the first PROC statement. before that,
  4672.   only global definitions (DEF,CONST,MODULE etc.) are allowed, and no code.
  4673.   In the second part, only code and function definitions are legal, no
  4674.   global definitions.
  4675.  
  4676. - 'could not read module correctly'
  4677.   A dos error occurred while trying to read a module from a MODULE
  4678.   statement. Causes:
  4679.   * emodules: was not assigned properly
  4680.   * module name was misspelled, or did not exist in the first place
  4681.   * you wrote MODULE 'bla.m' instead of MODULE 'bla'
  4682.  
  4683. - 'workspace full!'
  4684.   Rarely occurs. If it does, you'll need the '-m' (ADDBUF) option to
  4685.   manually force EC to make a bigger estimate on the needed amount of
  4686.   memory. Try compiling with -m2, then -m3 until the error disappears.
  4687.   You'll probably be writing huge applications with giant amounts
  4688.   of data just to even possibly get this error.
  4689.  
  4690. - 'not enough memory while (re-)allocating'
  4691.   Just like that. Possible solutions:
  4692.   1. You were running other programs in multitasking. Leave them and try again.
  4693.   2. You were low on memory anyway and your memory was fragmented.
  4694.      Try rebooting.
  4695.   3. None of 1-2. Buy a memory expansion (um).
  4696.  
  4697. - 'incorrect object definition'
  4698.   You were being silly while writing the definitions between OBJECT and
  4699.   ENDOBJECT. (see 8F to find out how to do it right).
  4700.  
  4701. - 'illegal use of/reference to object'
  4702.   If you use expressions like ptr.member, member needs to be a legal
  4703.   member of the object ptr is pointing to.
  4704.  
  4705. - 'incomplete if-then-else expression'
  4706.   If you use IF as an operator (see 4E), then an ELSE part
  4707.   needs to be present: an expression with an IF in it always needs to
  4708.   return a value, while a statement with an IF in it can just 'do nothing'
  4709.   if no ELSE part is present.
  4710.  
  4711. - 'unknown object identifier'
  4712.   You used an identifier that was recognised by the compiler as being
  4713.   part of some object, but you forgot to declare it. Causes:
  4714.   * misspelled name
  4715.   * missing module
  4716.   * the identifier in the module is spelled not like you expected
  4717.     from the RKRM's. Check with ShowModule.
  4718.     Note that amiga-system-objects inherit from assembly identifiers,
  4719.     not from C. Second: identifiers obey E-syntax.
  4720.  
  4721. - 'double declaration of object identifier'
  4722.   One identifier used in two object definitions
  4723.  
  4724. - 'reference(s) out of 32k range: switch to LARGE model'
  4725.   Your program is growing larger than 32k. Simply put 'OPT LARGE'
  4726.   in your source and code on. (see 16B).
  4727.  
  4728. - 'reference(s) out of 256 byte range'
  4729.   You probably wrote BRA.S or Bcc.S over too great a distance.
  4730.  
  4731. - 'too sizy expression'
  4732.   You used a string '' or list [], possibly recursive [[]], that is too sizy.
  4733.  
  4734. - 'incomplete exception handler definition'
  4735.   You probably used EXCEPT without HANDLE, or the other way round
  4736.   (see 13A on exception handling).
  4737.  
  4738. - 'not allowed in a module'
  4739.   You're doing one of the few things you can't do in a module,
  4740.   such as global variables with initialisations.
  4741.  
  4742. - 'allowed in modules only'
  4743.   you probably use EXPORT in your main source
  4744.  
  4745. - 'this doesn't make sense'
  4746.   general error.
  4747.  
  4748. - 'you need a newer version of EC for this :-)'
  4749.   You probably use a module that was compiled with a newer
  4750.   version of EC than you currently have.
  4751.  
  4752. - 'no matching "["'
  4753.   within a statement, a "]" was found, without a matching "]".
  4754.  
  4755. - 'this instruction needs a better CPU/FPU (see OPT)'
  4756.   You use a construction (probably an asm instruction) that
  4757.   requires an OPT 020 or the like.
  4758.  
  4759. - 'object doesn't understand this method'
  4760.   you invoke a method on a object that wasn't defined
  4761.   for its type.
  4762.  
  4763. - 'method doesn't have same #of args as method of baseclass'
  4764.   If you redefine a method, you have to make sure the new one
  4765.   has the same #of args as the original.
  4766.  
  4767. - 'too many register variables in this function'
  4768.   If you use :REG to assign register variables yourself,
  4769.   you can't use more than 5, currently.
  4770.  
  4771. - 'Linker can't find all symbols'
  4772.   If you use a module A that uses again a module B,
  4773.   B also needs to linked. A relies on certain PROCs to
  4774.   be present in B, and if B was recompiled with those
  4775.   PROCs removed, the linker has trouble putting your
  4776.   exe together.
  4777.  
  4778. - 'could not open "mathieeesingbas.library"'
  4779.   If you use float code, the compiler itself may need
  4780.   float functions to be able to generate code.
  4781.  
  4782. - 'illegal destructor definition'
  4783.   You defined an end() method with arguments (or with a returnvalue)
  4784.  
  4785. - 'implicit initialisation of private members'
  4786.   You write a [...] or NEW [...] expression that has private parts.
  4787.  
  4788. - 'double method declaration'
  4789.   You defined a method on this object twice.
  4790.  
  4791. - 'object referenced by other object not found'
  4792.   You probably inherited from some other object in another module, and
  4793.   then changed it (its name for example) without changing/recompiling
  4794.   other dependant modules too.
  4795.  
  4796. - 'unknown preprocessor keyword'
  4797.   only #define, #ifdef, #ifndef and #endif are known by EC's PP.
  4798.  
  4799. - 'illegal macro definition'
  4800.   You made a syntax error in typing your #define (see 17L)
  4801.  
  4802. - 'incoherent #ifdef/#ifndef nesting'
  4803.   You forgot to close with #endif or similar
  4804.  
  4805. - 'macro redefinition'
  4806.   You can't use the same macro-name-identifier twice.
  4807.  
  4808. - 'syntax error in #ifdef/#ifndef/#else/#endif'
  4809.   (see 17L for the correct way to write conditionally compiled code)
  4810.  
  4811. - 'macro(s) nested too deep'
  4812.   You will get this if macros expand to other macros which expand to yet
  4813.   others... such that the amount of memory needed for this is getting
  4814.   out of hand. More likely you just defined a recursive macro (which will
  4815.   want to expand forever).
  4816.  
  4817. - 'method definition out of object/module scope'
  4818.   You can only define methods for an object in the same module/source
  4819.   where that object is defined.
  4820.  
  4821.  
  4822. 16F. compiler buffer organisation and allocation
  4823. ------------------------------------------------
  4824. When you get the error 'workspace full' (very unlikely), or want
  4825. to know what really happens when your program is compiled, it's useful
  4826. to know how EC organizes its buffers.
  4827.  
  4828. A compiler, and in this case EC needs buffers to keep track of all sorts
  4829. of things, like identifiers etc., and it needs a buffer to keep the
  4830. generated code in. EC doesn't know how big these buffers need to be.
  4831. for most buffers, like the one for various strcutures, this is no
  4832. problem: if the buffer is full while compiling, EC just allocates a
  4833. new piece of memory and continues. Other buffers, like the one for
  4834. the generated code, need to be a continuous block of memory that doesn't
  4835. move while compiling: EC needs to make a pretty good estimate of
  4836. this buffersize to be able to compile small and large sources alike.
  4837. To do this, EC computes the needed memory relative to the size of
  4838. your source code, and adds a nice amount to it. This way, in 99% of the
  4839. cases, EC will have allocated enough memory to compile just about any
  4840. source, in other cases, you'll get the error and have to specify more
  4841. memory with the '-m' (ADDBUF) option.
  4842.  
  4843. Experiment with different types and sizes of example-sources in combination
  4844. with the '-b' (SHOWBUF) option (see 0D) to see how this works in practice.
  4845.  
  4846.  
  4847. 16G. register allocation
  4848. ------------------------
  4849. E v3 supports a register allocation, which is a technique to keep
  4850. variables in registers instead of on the stack. For normal code
  4851. that uses OS-routines you won't notice the difference very much,
  4852. but for tight computation-loops, this optimisation can make a big
  4853. difference. There are two ways to use register allocation:
  4854.  
  4855. - with the option REG.
  4856.   If you write for example EC REG=3 bla.e, (max=5, currently),
  4857.   EC will compute for each PROC the 3 most-used variables in
  4858.   registers. Register allocation is a technique that tries to be
  4859.   intelligent: it will compute for each var a weight, and will
  4860.   use heuristics to increase that weight, for example a var used
  4861.   in a FOR loop gets relatively a higher weight than one outside
  4862.   it, and one in an IF gets an even lower weight. These weights
  4863.   are combined, so a WHILE in a FOR gets quite a high weight.
  4864.  
  4865. - DIY: you can put the keyword REG in front of any type in a
  4866.   declaration, for example:
  4867.  
  4868.     DEF x:REG, s[4]:REG LIST
  4869.  
  4870.   you can do this if you don't trust the register-allocator,
  4871.   or if you want to fine-tune just one PROC. You can even use
  4872.   both together: if in a PROC you have one var with :REG,
  4873.   compiling with REG=5 will allow EC to pick the remaining 4
  4874.   by itself.
  4875.  
  4876. The default is REG=0, so EC works much like the older versions.
  4877.  
  4878. The variables that CAN be allocated are only local variables
  4879. that are not parameters. also, if you take the address of
  4880. a variable with {} it can't be put in a register either (guess
  4881. why...). registers can't be allocated in PROCs that have
  4882. an exception handler, for now.
  4883.  
  4884. There are a few things to note when using registers:
  4885. - this part of EC is currently (E v3.0a) was tested to
  4886.   be pretty reliable, but you still check that behaviour is
  4887.   the same as in non-allocated code.
  4888.   it _should_ work ok, but it's too early to guarantee it :-)
  4889.   In short: be careful for now when applying these techniques.
  4890. - EC uses registers D7..D3 for variables, so if you use
  4891.   inline assembly, you need to check that PROCs that use
  4892.   register-allocation or :REG don't trash these (see 15E).
  4893.   The code generated for a PROC automatically saves the
  4894.   registers it uses (callee save) to protect the code that
  4895.   called it.
  4896. - hint: compiling with REG=5 is not inherently fastest,
  4897.   since variable saving on function/library calls also
  4898.   incurs an overhead. REG=3 may be better for some
  4899.   cases. Also if _all_ code in question deals with
  4900.   library calls instead of pure computation, expect no
  4901.   gain from registers.
  4902.  
  4903. -> register allocation will easily make this program twice as fast
  4904.  
  4905. PROC main()
  4906.   DEF a,b=10,c=20,d
  4907.   FOR a:=1 TO 1000000 DO d:=b+c
  4908. ENDPROC
  4909.  
  4910. -> at most 5% faster when using register allocation
  4911.  
  4912. PROC main()
  4913.   DEF a,s[100]:STRING,t
  4914.   t:='putting "a" in a reg won''t give that much of a speedup, I think.'
  4915.   FOR a:=1 TO 100000 DO StrCopy(s,t)
  4916. ENDPROC
  4917.  
  4918.  
  4919. +---------------------------------------------------------------+
  4920. |                 17. Essential E Utilities            |
  4921. +---------------------------------------------------------------+
  4922.  
  4923. 17A. bin/showmodule
  4924. -------------------
  4925. As you might have noticed, E's equivalent for "includes", modules,
  4926. are binary files, much like those usually suplied with Modula2
  4927. compilers, for example. To display the contents of such a file
  4928. in readable ascii form, you may use showmodule:
  4929.  
  4930. showmodule <modulespec>
  4931.  
  4932. examples:
  4933.  
  4934. 1> showmodule emodules:intuition/intuition
  4935. 1> showmodule >gadtools.txt emodules:gadtools
  4936.  
  4937. note that showmodule by default outputs to stdout,
  4938. and may be interrupted at any point by <ctrlc>.
  4939.  
  4940.  
  4941.  
  4942. 17B. sources/utilities/showhunk.e, bin/showhunk
  4943. -----------------------------------------------
  4944. Displays all types of executable files, and also object ".o"
  4945. files as generated by (other) compilers/assemblers.
  4946. will show you the (very simple) structure of executables generated
  4947. by EC, but also support complex overlay-files. also dumps
  4948. labels (like XREF's and XDEF's).
  4949.  
  4950. most important of all, ShowHunk features a disassembler for
  4951. code-hunks. use the option 'DISASM/S'
  4952.  
  4953. showhunk <exefile>
  4954.  
  4955. like:   1> showhunk helloworld
  4956.         1> showhunk disasm dpaint
  4957.  
  4958.  
  4959. 17C. bin/iconvert, bin/pragma2module
  4960. ------------------------------------
  4961. These two utilities are for advanced E-programmers only. if
  4962. you don't feel like one (yet), skip this part.
  4963.  
  4964. [NOTE: like the showmodule utility, the sources to these utilities
  4965.  have been removed from the distribution, because people misused
  4966.  their knowledge of the .m module format. It is PRIVATE. Contact
  4967.  me first if you want to do something with it.]
  4968.  
  4969. Iconvert will convert structure and constant definitions in
  4970. assembly ".i" files to E modules, and pragma2module will do the
  4971. same for SAS/C pragma library definition files. Of course, all
  4972. commodores includes have already been converted this way, but
  4973. say you find a nice PD library that you may want to use with E,
  4974. you will need these utilities.
  4975.  
  4976. most libraries come with various includes defining, most obvious,
  4977. the library calls of the library, as well as the constants
  4978. and structures (OBJECTs in E) that it uses. say that it is
  4979. called "tools.library", then it will probably feature:
  4980.  
  4981. pragmas/tools_pragmas.h
  4982. includes/tools.i
  4983.  
  4984. then do:
  4985.  
  4986. 1> pragma2module tools_pragmas.h
  4987.  
  4988. rename the resulting "tools_pragmas.m" to "tools.m" and put it
  4989. in emodules:, check with ShowModule if all went well.
  4990.  
  4991. Now, in your program you may use tools.library:
  4992.  
  4993. MODULE 'tools'
  4994.  
  4995. PROC main()
  4996.   IF (toolsbase:=Openlibrary('tools.library',37))=NIL THEN error()
  4997.  
  4998.   ToolsFunc()
  4999.  
  5000. ...etc.
  5001.  
  5002. convert tools.i with Iconvert to another tools.m, which you place in
  5003. emodules:libraries, for example. Iconvert needs an assembler like
  5004. the PD A68k to do the hard work of understanding the actual assembly.
  5005.  
  5006. 1> iconvert tools.i
  5007.  
  5008. see with showmodule what became of the ".i" file. use in your
  5009. program with:
  5010.  
  5011. MODULE 'libraries/tools'
  5012.  
  5013. DEF x:toolsobj, y=TOOLS_CONST
  5014.  
  5015. converting with Iconvert may require some assembly expertise, as
  5016. Iconvert relies on the correct format of the ".i" file, just like
  5017. commodores assembly includes. About 10% of the ".i" files need
  5018. to be patched by hand to be "convertable". definitions that
  5019. Iconvert judges correctly are amongst others
  5020.  
  5021. <label> EQU <any_expression>
  5022.  
  5023. STRUCTURE <sname>,0      ; if <>0, then   <struct>_SIZEOF
  5024. ULONG <sname>_<label>
  5025. BPTR <sname>_<label>
  5026.    ; etc.
  5027. LABEL <sname>_SIZEOF     ; or "_SIZE"
  5028.  
  5029. to get an idea what kind of assembly-expression Iconvert can
  5030. handle, take a look at commodores assembly includes and compare
  5031. them to the equivalent modules (for example intuition.i).
  5032.  
  5033.  
  5034. 17D. bin/ShowCache, bin/FlushCache
  5035. ----------------------------------
  5036. The E Module Cache is a piece of memory that is able to hold
  5037. modules (.m) between compiles. The first time you use a certain
  5038. module, EC will load it from disk and put it in the cache. the
  5039. second time and on, EC will find it in cache and doesn't have to
  5040. load anything from disk. If EC compiles a module of which an
  5041. old version is present in cache, it will flush it. One can imagine
  5042. that this a tremendous speedup, even for people with HD's when
  5043. they use a lot of modules and recompile often.
  5044.  
  5045. To see what's currently stored in the cache (and how much memory
  5046. it's wasteing :-), type:
  5047.  
  5048. 1> ShowCache
  5049.  
  5050. A second utility, FlushCache, allows you to selectively remove modules
  5051. from the cache. Reasons for this can be:
  5052. - you can't afford the memory it uses
  5053. - you created a new .m, with a tool other than EC, so you need to flush
  5054.   by hand.
  5055. The argument to Flushcache is the substring that needs to occur in
  5056. a module name for it to be flushed. no args means flush all.
  5057.  
  5058. 1> FlushCache                        ; empty whole cache
  5059. 1> FlushCache intuition/             ; flush all intuition-related modules
  5060.  
  5061. You can use the EC option 'IGNORECACHE/S' to compile a source without
  5062. using the cache. Whether the cache is full or empty, EC will load
  5063. all from disk, and store nothing new in cache.
  5064.  
  5065. If two EC's try to access the cache simultaneously in multitasking,
  5066. the second EC acts as if its IGNORECACHE flag were set.
  5067.  
  5068.  
  5069. 17E. rexx/ecompile.rexx
  5070. -----------------------
  5071. [what's keeping the other rexx-scripts?]
  5072.  
  5073. This is a rexx-script for CygnusEd (tm), and enables you to
  5074. compile E programs from the editor. Just assign this script
  5075. a function key in the editor with "Install Dos/Arexx command ..."
  5076. (check your CED-manual if you're not sure how to do this).
  5077. Now write your programs, and press Fx if you wish to compile.
  5078. Your source will be saved if necessary, the compiler will be
  5079. invoked on a separate console window, and the program is run
  5080. on the same console. When your program is done, you may press
  5081. <return> to return to the editor (CED-screen to back and front is
  5082. automatically done by the script). If an error occurred during
  5083. compilation, the script will let CED jump to the line of
  5084. error after you pressed <return>
  5085.  
  5086. Note: in the script there is a path name as to where the compiler
  5087. can be found. You probably need to change this. Also, the script
  5088. copies EC to ram: for systems with a slower SYS: device, you may
  5089. want to disable this if you have a fast HD.
  5090.  
  5091.  
  5092. 17F. bin/o2m
  5093. ------------
  5094. If you have large pieces of assembly source that you'd like to use it
  5095. would be tedious at best to convert them all by hand to E's inline
  5096. assembly. o2m allows you to simply have your favourite macro-assembler
  5097. assemble it all to a .o file, and o2, then will turn this .o file into
  5098. a .m file for use with E. If you have a file bla.o:
  5099.  
  5100. 1> o2m bla
  5101.  
  5102. will produce bla.m. However, the .o file will have to obey certain rules.
  5103. It should consist of just one code-hunk with external definitions (XDEFs)
  5104. for each symbol you wish to reference from E, and no XREFs. typically,
  5105.  
  5106. your source would look like:
  5107.  
  5108.     XDEF add__ii
  5109.  
  5110. add__ii:
  5111.     move.l    4(a7),d0
  5112.     add.l    8(a7),d0
  5113.     rts
  5114.     
  5115. this example shows a bit of assembly code that gets two arguments (hence
  5116. the two "i" for integer). arguments can be found on the stack, where
  5117. 4(a7) is the last arg, 8(a7) the one before that etc.
  5118.  
  5119. Showhunk shows you this:
  5120.  
  5121.         hunk_unit: 
  5122. HUNK -1 hunk_name:  
  5123.         hunk_code: 12 bytes
  5124.         hunk_ext
  5125.           add__ii = $0
  5126.  
  5127. this type of .o file is easily transformed to .m by o2m:
  5128.  
  5129. /* this module contains 12 bytes of code! */
  5130.  
  5131. PROC add(a,b)
  5132.  
  5133.  
  5134. there are a couple of things to note:
  5135. - if your asm code uses D3-D7/A4/A5 you should probably save it.
  5136. - if a label doesn't have the "__" with an "i" for each function,
  5137.   it becomes a parameterless function. Don't worry if the label
  5138.   actually references data, you can simply get the address of this
  5139.   'proc' with {}, and use it as a ptr to your data.
  5140.  
  5141. theoretically, o2m could be used to link C code to E programs,
  5142. however in practise this is often not feasable. If your C compiler
  5143. allows you to 'tune' the resulting .o files a bit, this might work.
  5144.  
  5145. some problems are:
  5146. - reference of C functions, for example _printf()
  5147. - reference of globals vars created by C startup code. C code
  5148.   may reference "DOSBase" as an XREF, whereas E's startup code makes 
  5149.   this value available somewhere on the stack
  5150. - call/register conventions.
  5151.  
  5152. I did manage to link a small C function to E that only does some
  5153. computation, and call it succesfully (this was done using MaxonC++,
  5154. whose linker uses the __ii convention for parameters also).
  5155.  
  5156.  
  5157. 17G. bin/EYacc
  5158. --------------
  5159. This is a port of the famous Yacc utility for unix, which now
  5160. produces E code instead of C code. It is only a first version,
  5161. so don't expect too much from it. If you have no clue what Yacc
  5162. does, read a text on it, since I'm not going to explain that in full
  5163. here.
  5164.  
  5165. Basically you can write .y sources as normal, only where actions
  5166. used to be written in C, now you can write E. See the Src/Yacc/bcalc.y
  5167. example.
  5168.  
  5169. 1> eyacc bcalc.y
  5170.  
  5171. produces a file 'yyparse.e'
  5172.  
  5173. 1> ec yyparse
  5174.  
  5175. will get you a module, which contains only the function yyparse().
  5176. The rest of 'how to interface with Yacc' should be analoguous to C.
  5177.  
  5178. [note: I'm halfway through a translation of Lex to E-Lex, but not done yet.]
  5179.  
  5180. further info.
  5181. E-Yacc is a modification of Berkeley Yacc 1.8, originally by
  5182. corbett@berkeley.edu. The inclusion of this modified version
  5183. in the E distribution is totally legal, as the author states in
  5184. the original BYacc1.8 README:
  5185.  
  5186. "   Berkeley Yacc is in the public domain.  The data structures and algorithms
  5187. used in Berkeley Yacc are all either taken from documents available to the
  5188. general public or are inventions of the author.  Anyone may freely distribute
  5189. source or binary forms of Berkeley Yacc whether unchanged or modified.
  5190. Distributers may charge whatever fees they can obtain for Berkeley Yacc.
  5191. Programs generated by Berkeley Yacc may be distributed freely. "
  5192.  
  5193.  
  5194. 17H. bin/SrcGen
  5195. ---------------
  5196. [note: this utility hasn't been updated to work better with
  5197.  the E module system, it still outputs just the raw source
  5198.  (which is then easily incorporated in any module). If there
  5199.  is much demand I will upgrade this utility. If you want to
  5200.  add a nice GUI to your program, also take a look at
  5201.  modules/tools/EasyGUI.m, or newer toolkits suchs as the upcoming
  5202.  BGUI from Jan van den Baard, the author of GadToolsBox.]
  5203.  
  5204. SrcGen GadToolBox source generator for E: beta version
  5205.  
  5206. You'll be needing GadToolBox v2.0 or higher, and have the
  5207. gadtoolsbox.library that comes with it in your LIBS:. Now, with GTB,
  5208. make some simple example (just a window with a few gadgets/menus etc.),
  5209. save it as "bla" (filename will be "bla.gui"), and type:
  5210.  
  5211. 1> SrcGen bla
  5212. 1> EC bla
  5213. 1> bla
  5214.  
  5215. "bla.e" contains the routines for opening your interface, as well
  5216. as some routines to handle idcmpmessages, errors etc., and a dummy
  5217. "main" that just waits for one selection. here you can put in
  5218. your own code. see the commandline template how to stop SrcGen from
  5219. generating these routines.
  5220.  
  5221. That's all there's to it. If you have problems, just check the
  5222. source that has been generated.
  5223.  
  5224.  
  5225. 17I. bin/EBuild
  5226. ---------------
  5227. EBuild is a "Make" clone, and it functions likewise. Build is a tool
  5228. that helps you in recompiling necessary parts of a large application
  5229. after modification. You write a file ".build" in the directory
  5230. that contains the sources of your project. The file contains info
  5231. about which sources depend on which, and what actions need to be
  5232. performed if a module or exe needs to be rebuilt. Build checks the
  5233. dates of the files to see if a source has been modified after the
  5234. last compilation, and if the source uses modules that also have
  5235. been modified, it will compile these first.
  5236.  
  5237. the syntax equals that of unix-make. in general, "#" precedes
  5238. lines with comments, and:
  5239.  
  5240. target: dep1 dep2 ...
  5241.   action1
  5242.   action2
  5243.   ...
  5244.  
  5245. target is the resulting file we're talking about, in most cases an
  5246. exe or module, but may be anything. Following the ":" you write all
  5247. files that it depends upon, most notably its source, and other modules.
  5248. The actions on the following lines are normal AmigaDos commands, and
  5249. need to be preceded by at least one space or tab to distinquish them
  5250. from targets.
  5251.  
  5252. bla: bla.e defs.m
  5253.      ec bla quiet
  5254.  
  5255. this simple example will only recompile 'bla.e' if it was modified,
  5256. or if the defs.m which it uses was modified.
  5257.  
  5258. If you type 'build' with no args, build will ensure the
  5259. first target to be up to date.
  5260.  
  5261. TARGET,FROM/K,FORCE/S: 
  5262.  
  5263. if you supply a TARGET, this way build will start with another target.
  5264. FROM allows you to use another file than ".build", and FORCE will
  5265. rebuild everything, regardless of whether it was really necessary.
  5266.  
  5267. Example:
  5268.  
  5269.  
  5270. # test build file
  5271.  
  5272. all:    bla burp
  5273.  
  5274. defs.m:    defs.e
  5275.     ec defs quiet
  5276.  
  5277. bla:    bla.e defs.m
  5278.     ec bla quiet
  5279.  
  5280. burp:    burp.e
  5281.     ec burp quiet
  5282.  
  5283. clean:
  5284.     delete  defs.m bla burp
  5285.  
  5286.  
  5287. this build file is about two programs, bla and burp, of which bla
  5288. also depends on a module defs.m. An extra fake target 'clean' has
  5289. been added so you can type 'build clean' to delete all results.
  5290.  
  5291. Other dependencies and actions are easily added. for example,
  5292. if your project uses a parser generated by E-Yacc:
  5293.  
  5294. yyparse.m: parser.y
  5295.            eyacc parser.y
  5296.            ec yyparse quiet
  5297.  
  5298. Or incorporates macro-assembly code as often used tool module:
  5299.  
  5300. blerk.m: blerk.s
  5301.          a68k blerk.s
  5302.          o2m blerk
  5303.          copy blerk.m emodules:tools
  5304.          flushcache tools/blerk
  5305.  
  5306. Once you get to know build, you'll discover you can use it for
  5307. more purposes than just this. see it as an intelligent script tool.
  5308.  
  5309. If you want to find out the details of what build can do, read the
  5310. documentation of some unix-make, as build should be somewhat compatible
  5311. with this. what it doesn't do for now, is:
  5312.  
  5313. - rule out cyclic dependancies
  5314. - allow "\" at the end of a line for longer rules
  5315. - constant definitions
  5316.  
  5317.  
  5318. For v3.1 it was updated by Jason Hulance, to fix the bug that executed
  5319. actions in reverse order. Also he changed execution of action into
  5320. a script (transparent). in this script the variable 'target' is set to
  5321. the actual target. example:
  5322.  
  5323.  
  5324. test:    test.e
  5325.     ec "$target"
  5326.     if warn
  5327.         echo "Error: compile failed"
  5328.     else
  5329.         echo "Compiled OK... running"
  5330.         "$target"
  5331.     endif
  5332.  
  5333.  
  5334. largely equivalent to the old code below, but allows more.
  5335.  
  5336.  
  5337. all:    test
  5338.     echo "ok, running:"
  5339.     test
  5340.  
  5341. test:    test.e
  5342.     ec -q test
  5343.  
  5344.  
  5345.  
  5346.  
  5347. 17J. EE / Aprof
  5348. ---------------
  5349.  
  5350. These are described in their own documentation in the tools directory.
  5351.  
  5352.  
  5353. 17K. EDBG
  5354. ---------
  5355.  
  5356. EDBG is the E sourcelevel debugger. To use it, compile your source with
  5357. the DEBUG flag (this works on both main program an modules).
  5358. This will add debug infos to your executable/module
  5359.  
  5360. NOTE: Do NOT distribute a program of which any part is compiled with DEBUG/S.
  5361. (You can check this with ShowHunk, it should not contain any hunk_debug).
  5362. Programs with debug-infos are compiled with extra NOPs to facilitate
  5363. debugging, which isn't wanted in the final code.
  5364.  
  5365. Always make sure sources and compiled are in the current directory, then
  5366. fire up EDBG with:
  5367.  
  5368. 1> EDBG exename
  5369.  
  5370. template:
  5371.  
  5372. EXECUTABLE/A,PUBSCREEN/K: 
  5373.  
  5374. with for example PUBSCREEN=Workbench you can run EDBG anywhere. By default
  5375. it opens it own screen, which is a clone of the workbench in size and
  5376. display mode. EDBG works fine on the Picasso etc.
  5377.  
  5378. EDBG opens a window for every source in your project, and it will start with
  5379. the one that contains 'main'. From you can step through your code, and
  5380. windows will automatically open when necessary. When code doesn't have
  5381. a source attached, it can be executed only (which is sometimes handy, if
  5382. it doesn't need to be debugged).
  5383.  
  5384. From here all is pretty intuitive. Major buttons are the first two pictures
  5385. which are step over/in. Step in follows the code every step as it is
  5386. executed, step over does the same but does not enter subroutines.
  5387. [Just try it, the debugger is quite intuitive]
  5388.  
  5389. Other functions show memory or register windows, and various other functions
  5390. (some not implemented). An important one is double-clicking on variable-names:
  5391. this will show their contents in the temporary window (I know, this should
  5392. be something more comfortable in the future).
  5393.  
  5394. CAVEATS:
  5395. - The debugged program runs on the same task as EDBG. this means that
  5396.   all code that does something special to the task will have to be
  5397.   careful. An example is Forbid() etc.
  5398. - A special case is ReadArgs(). because EDBG already read the args, a
  5399.   call from the debugged program will cause a read from the console.
  5400.   So you can conveniently type the args to your program on the commandline
  5401.   and press return.
  5402.  
  5403. NOTE: EDBG is still a bit beta, but already VERY useful. It misses a lot
  5404. of features, and you'll just have to wait a bit before these get implemented.
  5405. [so don't come and warn me "X doesn't work" or "EDBG needs X", since I _know_.]
  5406.  
  5407.  
  5408.  
  5409. The LINEDEBUG and SYM options.
  5410. The LINEDEBUG option adds linedebug info to your executable (for each line of
  5411. code inside a PROC). This option is necessary for EDBG, but the DEBUG switch
  5412. automatically turns it on. LINEDEBUG is partially compatible with the "LINE"
  5413. HUNK_DEBUG produced by other compilers/assemblers, so it can be useful with
  5414. other debug-tools as well. The SYM option is not necessary for EDBG, but
  5415. can be useful for others, such as AProf or disassemblers.
  5416.  
  5417.  
  5418. worst known bugs:
  5419. - You can't scroll the current-line out of sight in a sourceview because
  5420.   EDBG tries to keep it in sight.
  5421. - lots others... probably
  5422.  
  5423.  
  5424. 17L. EC PreProcessor
  5425. --------------------
  5426.  
  5427. EC has an internal preprocessor which features macro substitution and
  5428. conditional compilation. These are not features of the E language,
  5429. rather it has been integrated with EC for speed and flexibility.
  5430.  
  5431. Activating the preprocessor.
  5432. Until you type:
  5433.  
  5434.     OPT PREPROCESS
  5435.  
  5436. EC will behave as normal. This OPT is necessary for any preprocessor
  5437. related feature.
  5438.  
  5439. Macros.
  5440. The macropreprocessor is compatible with Mac2E and the C language PP.
  5441. You can define macros as follows:
  5442.  
  5443.     #define MACRONAME
  5444.     #define MACRONAME BODY
  5445.     #define MACRONAME(ARG,...) BODY
  5446.     #define MACRONAME(ARG,...) BODY \
  5447.       REST OF BODY
  5448.  
  5449. MACRONAME and ARG may be ANY case, and may contain "_" and 0-9 as usual.
  5450. Whitespace may be added everywhere, except between MACRONAME and "(", because
  5451. otherwise EC can't see the difference between arguments and a body.
  5452. The BODY may contain occurances of the ARGs. A macro may continue on the
  5453. next line by preceding the end_of_line with a "\".
  5454. [a macroname with no body is useful in combination with conditional
  5455.  compilation].
  5456.  
  5457. Macro identifiers have precedence over other identifiers.
  5458.  
  5459. Macro definitions defined in a module will be saved in the module only if
  5460. OPT EXPORT is on (#define can't be preceded with EXPORT). If that's a problem,
  5461. keep macros together in their own modules. Macros in modules can be used in
  5462. other code simply by importing them with MODULE and OPT PREPROCESS.
  5463.  
  5464.  
  5465. Using a macro.
  5466. Using MACRONAME anywhere in the program will insert the body of the macro
  5467. at that spot. Note that this substitution is text substitution, and has
  5468. little to do with actual E syntax. If the macros have arguments they will
  5469. be inserted at their respective places in the macrobody. If the body (or
  5470. the arguments) contain futher macros, these will be expanded after that.
  5471.  
  5472. example:
  5473.  
  5474.     #define MAX(x,y) (IF x>y THEN x ELSE y)
  5475.  
  5476.     WriteF('biggest = \d\n',MAX(10,a))
  5477.  
  5478. will equal writing:
  5479.  
  5480.     WriteF('biggest = \d\n',(IF 10>a THEN 10 ELSE a))
  5481.  
  5482. This immediately shows a danger of macros: since it simply copies
  5483. textually, writing MAX(large_computation(),1) will generate code
  5484. that executes large_computation() twice. Be aware of this.
  5485.  
  5486.  
  5487.  
  5488. Conditional compilation.
  5489. This can be useful if you wish to decide at compile time which part of
  5490. your code to use. syntax:
  5491.  
  5492.     #ifdef MACRONAME
  5493.  
  5494. or
  5495.  
  5496.     #ifndef MACRONAME
  5497.  
  5498. the piece of source following this will or won't be compiled depending on
  5499. whether MACRONAME was defined. you can simply do this with:
  5500.  
  5501.     #define MYFLAG
  5502.  
  5503. or somesuch. End a conditionally compiled block with:
  5504.  
  5505.     #endif
  5506.  
  5507. Blocks like these may be nested. example:
  5508.  
  5509. #define DEBUG
  5510. ->#define HEAVYDEBUG
  5511.  
  5512. #ifdef DEBUG
  5513.   WriteF('now entering bla() with x = \d\n',x)
  5514. #ifdef HEAVYDEBUG
  5515.   WriteF('now dumping memory...\n')
  5516.   /* ... */
  5517. #endif
  5518. #endif
  5519.  
  5520.  
  5521.  
  5522. 18A. The E grammar
  5523. ------------------
  5524.  
  5525.  
  5526. This is a grammar of E for those who are interested. Don't expect
  5527. it to be up to date or otherwise complete/correct though (it should
  5528. be quite ok for E upto v2.1b atleast).
  5529.  
  5530. lex syntax: regular expressions
  5531. parse syntax: own ASF/SDF adaption;
  5532.  
  5533.     name    = grammar ident
  5534.     "name"    = constant
  5535.     ()    = grouping
  5536.     |    = or
  5537.     e*    = 0 or more of e
  5538.     e+    = 1 or more of e
  5539.     {e s}*    = 0 or more of e separated by s
  5540.     {e s}+    = 1 or more of e separated by s
  5541.     [e]    = e is optional
  5542.     ; e    = e is comment :-)
  5543.  
  5544.  
  5545.  
  5546. LEX
  5547. ---
  5548.  
  5549.  
  5550.  
  5551. whitespace    = [ \t]     ; also \n if last token is [,+-*/] or similar
  5552.           anything between "/*" and "*/"
  5553.           from "->" to \n
  5554. eol        = [;\n]
  5555.  
  5556. constant    = [A-Z] ( [A-Z] [A-Za-z0-9_]* )?
  5557. builtin        = [A-Z] [a-z] [A-Za-z0-9_]*
  5558. ident,objident    = [a-z] [a-zA-Z0-9_]*
  5559.  
  5560. num        = [0-9]+    ; "-" is separate token
  5561.                   $[0-9A-Fa-f]+
  5562.           %[01]+
  5563. fnum        = [0-9]*.[0-9]*
  5564.  
  5565. stringconst    = anything in ''
  5566. charconst    = anything in ""
  5567.  
  5568.  
  5569.  
  5570. PARSE
  5571. -----
  5572.  
  5573.  
  5574. program        = opts globalpart localpart
  5575.  
  5576. globalpart    = ( modulestat | defstat | objdecl | constdecl | raisedecl )*
  5577. localpart    = ( procdecl | constdecl )+
  5578.  
  5579. modulestat    = "MODULE" { conststring "," }+ eol
  5580. defstat        = "DEF" vardecllist eol
  5581. objdecl        = "OBJECT" ident [ "OF" ident ] eol
  5582.                      ( vardecllist eol )+
  5583.                   "ENDOBJECT" eol
  5584. constdecl    = "CONST" { ( constant "=" constexp ) "," }+ |
  5585.           "ENUM" { ( constant | constant "=" constexp ) "," }+ |
  5586.           "SET" { constant "," }+
  5587. procdecl    = [ "EXPORT" ] "PROC" ident "(" argdecllist ")"
  5588.                   [ "OF" ident ] [ "HANDLE" ]
  5589.                   ( ( "RETURN" | "IS" ) { exp "," }* |
  5590.                      eol defstat* stats 
  5591.                      [ "EXCEPT" eol stats ]
  5592.                      "ENDPROC" { exp "," }* eol )
  5593. raisedecl    = "RAISE" { ( constant "IF" builtin "()" compop num ) "," }+
  5594. opts        = ( "OPT" { setting "," }+ )*        ; machine dependant
  5595.  
  5596. vardecllist    = { vardecl "," }+
  5597. vardecl        = ident [ "=" num ]
  5598.                     [ ":" ( "LONG" | "REAL" | "PTR" "TO" ptrtype ) ] |
  5599.                   ident ":" objtype |
  5600.                   ident "[" num "]" ":"
  5601.                     ( "ARRAY" |
  5602.                       "ARRAY" "OF" ptrtype |
  5603.                       "STRING" |
  5604.                       "LIST" )
  5605. argdecllist    = { argdecl "," }+
  5606. argdecl        = ident [ "=" defaultarg ]
  5607.                     [ ":" ( "LONG" | "REAL" | "PTR" "TO" ptrtype ) ]
  5608. ptrtype        = objtype | simpletype
  5609. simpletype    = CHAR | INT | LONG
  5610. objtype        = ident
  5611.  
  5612. stats        = ( ( onelinestat | multlinestat ) eol )*
  5613. onelinestat    = exp |
  5614.           lval ":=" exp |
  5615.           { var "," }+ ":=" exp |
  5616.           "IF" exp "THEN" onelinestat "ELSE" onelinestat |
  5617.           "FOR" var ":=" exp "TO" exp [ "STEP" num ]
  5618.                      "DO" onelinestat |
  5619.           "WHILE" exp "DO" onelinestat |
  5620.           "RETURN" { exp "," }* |
  5621.           "JUMP" ident |
  5622.                   ( "INC" | "DEC" ) var |        ; nearly obsolete
  5623.           asm_mnemonic { operand "," }*    |    ; machine dependant
  5624.           "INCBIN" stringconst |        ; inline asm support
  5625.           simpletype { num "," }+ |
  5626.           "VOID" exp                ; obsolete
  5627. multlinestat    = "IF" exp eol stats
  5628.                      [ ( "ELSEIF" exp eol stats )* ] 
  5629.                      [ "ELSE" eol stats ]
  5630.                      "ENDIF" |
  5631.           "FOR" var ":=" exp "TO" exp [ "STEP" num ] eol
  5632.                      stats "ENDPROC" |
  5633.           "WHILE" exp eol stats "ENDWHILE" |
  5634.           "REPEAT" eol stats "UNTIL" exp |
  5635.           "SELECT" var eol
  5636.                      ( "CASE" exp eol stats )+
  5637.                      [ "DEFAULT" eol stats ]
  5638.                      "ENDSELECT" |
  5639.                   "LOOP" eol stats "ENDLOOP"
  5640.  
  5641. explist        = { exp "," }+
  5642. exp        = [ "-" ] { item binop }+ |
  5643.           exp "BUT" exp
  5644. item        = num | fnum | lval | stringconst | charconst |
  5645.           "SIZEOF" objident |
  5646.           "IF" exp "THEN" exp "ELSE" exp |
  5647.           "[" explist "]" [ ":" ptrtype ] |
  5648.           ( builtin | ident ) "(" explist ")" |
  5649.           var ":=" exp |
  5650.           "{" ident "}" |
  5651.           "`" exp |
  5652. binop        = mathop | compop | logop
  5653. mathop        = "+" | "-" | "*" | "/"
  5654. compop        = "=" | "<>" | ">" | "<" | ">=" | "<="
  5655. logop        = "AND" | "OR"
  5656. constexp    = [ "-" ] { num ( "+" | "-" | "*" | "/" ) }+
  5657. lval        = var ( "[" [ exp ] "]" | "." ident )* [ "++" | "--" ] |
  5658.           "^" var [ "++" | "--" ] |
  5659. var        = ident
  5660. defaultarg    = num
  5661.  
  5662.  
  5663.  
  5664. 18B. Tutorial
  5665. -------------
  5666.  
  5667.  
  5668. NOTE: the original E v2.1b tutorial has been removed, since it
  5669. was not a very useful tutorial, IMHO. Instead, Jason Hulance made
  5670. an extensive E tutorial that you'd definitly want to take a look at.
  5671.  
  5672.  
  5673.  
  5674. 18C. Mapping E to C/C++/Pascal/Ada/Lisp etc.
  5675. --------------------------------------------
  5676.  
  5677.  
  5678. [some new stuff has been added here]
  5679.  
  5680. In the first/second column I will match E against AnsiC/C++, the third
  5681. column is reserved for a third language. I will mainly use Pascal here,
  5682. but where a feature asks for it, I will use others (for example, LISP
  5683. with quoted expression, Ada with exceptions etc.
  5684.  
  5685. note well: take these tables with a grain of salt. I'll try to denote
  5686. syntactic equivalences, and semantic properties as well as possible,
  5687. but different languages still need their own evaluation.
  5688.  
  5689. usage of signs:
  5690.  
  5691. -    = feature not available in language in question.
  5692. ?    = author has no clue what this feature translates to.
  5693.       (or atleast he's not sure).
  5694. ...    = feature may be available, but no appropriate 1:1 translation
  5695.       possible to make it interesting.
  5696. x,y,z    = arbitrary identifiers
  5697. e,f,g    = arbitrary expressions
  5698. s,t,u    = arbitrary statements
  5699. i,j,k    = arbitrary integers
  5700. etc.
  5701.  
  5702.  
  5703. -----------------------------------------------------------------------
  5704. STRUCTURE/STATEMENTS
  5705.  
  5706. E            C/C++            Pascal
  5707. ----------------------- ----------------------- -----------------------
  5708. PROC x()        int x() {        FUNCTION x:INTEGER;
  5709. PROC x(y,z)        int x(y,z) {        FUNCTION x(y,z:INTEGER):INTEGER;
  5710. PROC x(y=1)        int x(y=1) {        -
  5711. ENDPROC            return 0; };        x:=0; END;
  5712. ENDPROC e        return e; };        x:=e; END;
  5713. ENDPROC e,f,g        -            -
  5714. RETURN e        return e;        ?
  5715.  
  5716. IF e            if(e) {            IF e THEN BEGIN
  5717. ELSEIF e        } else if(e) {        END ELSE IF e THEN BEGIN
  5718. ELSE            } else {        END ELSE BEGIN
  5719. ENDIF            };            END;
  5720. IF e THEN s        if(e) s;        IF e THEN s;
  5721. IF e THEN s ELSE t    if(e) s else t;        IF e THEN s ELSE t;
  5722.  
  5723. FOR x:=e TO f        - (1)            FOR x:=e TO f DO BEGIN
  5724. FOR x:=e TO f STEP i    -            - (2)
  5725. EXIT e            if(e) break;        -
  5726. ENDFOR            -            END;
  5727. FOR x:=e TO f DO s    -            FOR x:=e TO f DO s;
  5728.  
  5729. WHILE e            while(e) {        WHILE e DO BEGIN
  5730. EXIT e            if(e) break;        -
  5731. ENDWHILE        };            END;
  5732. WHILE e DO s        while(e) s;        WHILE e DO s;
  5733.  
  5734. s; WHILE e        for(s;e;u) {        s; WHILE e DO BEGIN
  5735.   t; u              t;              t; u
  5736. ENDWHILE        };            END;
  5737.  
  5738. REPEAT            do {            REPEAT
  5739. UNTIL e            } while(!e);        UNTIL e;
  5740.  
  5741. LOOP            for(;;) {        WHILE TRUE DO BEGIN (?)
  5742. ENDLOOP            };            END;
  5743.  
  5744. SELECT x        switch(x) {        CASE x OF
  5745. SELECT x OF y        switch(x) {        CASE x OF
  5746. CASE 1; s...        case 1: s...; break    1: BEGIN s... END
  5747. CASE a+1        -            -
  5748. CASE 1,2,3        case 1: case 2: case3:    1,2,3:
  5749. CASE "a".."z"        -            -
  5750. ENDSELECT        };            END
  5751.  
  5752. INC x            x++;            x:=x+1; (INC())
  5753. DEC x            x--;            x:=x-1; (DEC())
  5754. JUMP lab        goto lab;        GOTO lab;
  5755. x:=e            x=e;            x:=e;
  5756.  
  5757. /* */            /* */            { }
  5758. ->            //            -
  5759.  
  5760. (1) see WHILE; C has no FOR, "for" in C is another way of writing "while"
  5761. (2) only STEP -1 as DOWNTO
  5762.  
  5763.  
  5764. -----------------------------------------------------------------------
  5765. VALUES
  5766.  
  5767. E            C/C++            Pascal
  5768. ----------------------- ----------------------- -----------------------
  5769. 1            1            1
  5770. 1.0            1.0            1.0
  5771. $1            0x1            ?
  5772. %1            ?            ?
  5773. "a"            'a'            chr(97) (?)
  5774. 'blabla'        "blabla"        'blabla'
  5775. [1,2,3]            - (1)            -
  5776. [1,2,3]:INT        -            -
  5777.  
  5778. (1) in translating from E to C, you can often simulate them with:
  5779.  
  5780. myfunc([1,2,3])
  5781.  
  5782. becomes:
  5783.  
  5784. int dummy [] = {1,2,3};
  5785. myfunc(dummy);
  5786.  
  5787.  
  5788. -----------------------------------------------------------------------
  5789. OPERATORS
  5790.  
  5791. E            C/C++            Pascal
  5792. ----------------------- ----------------------- -----------------------
  5793. + - * /            + - * /            + - * DIV
  5794. = <> > < >= <=        == != > < >= <=        = <> > < >= <=
  5795. AND OR    (log)        && ||            and or
  5796. AND OR    (bit)        & |            ?
  5797. SIZEOF x        sizeof(x)        -
  5798. `e            -            - (1)
  5799. ^x    (4)        *x            ...
  5800. {x}            &x            ...
  5801. x++            x++            -
  5802. x--            --x            -
  5803. -x            -x            -x
  5804. IF e THEN f ELSE g    e ? f : g        -
  5805. x.y            x->y            x^.y
  5806. -            x.y            x.y
  5807. x.y.z            x->y->z            x^.y^.z
  5808. x:=e            x=e            -
  5809. e BUT f            (e,f)            -
  5810. x[]            x[0] *x (2)        x[0]
  5811. x[1]            x[1]            x[1]
  5812. x[1]    (3)        &x[1]            ?
  5813. x[1].y            x[1]->y            x[1]^.y
  5814. x[]++            *x++            -
  5815. x[1].y++        *(x+1)++        -
  5816. x::y.a            ((y *)x)->a        -
  5817. x.y::z.a        ((z *)x->y)->a        -
  5818.  
  5819. (1) see QUOTED EXPRESSIONS
  5820. (2) also for others, equivalences between *(x+e) and x[e] hold.
  5821. (3) if ARRAY OF <object>
  5822. (4) ONLY for giving by reference. otherwise: "[]"
  5823.  
  5824. -----------------------------------------------------------------------
  5825. CONSTANTS/TYPES
  5826.  
  5827. E            C/C++            Pascal
  5828. ----------------------- ----------------------- -----------------------
  5829. CONST X=1        #define X 1        CONST X=1;
  5830.             const int X=1;
  5831. ENUM X,Y,Z        #define X 0 (etc.)    TYPE x=(X,Y,Z);
  5832.             enum x{X,Y,Z};
  5833. SET X,Y,Z        -            TYPE x=SET OF (X,Y,Z);
  5834.  
  5835. DEF                        VAR
  5836. x            int x; (or: long x;)    x:INTEGER;
  5837. x:LONG            int x;            x:INTEGER;
  5838. x:PTR TO y        struct y* x;        x:^y;
  5839. x:y            struct y x;        x:y;
  5840. x[10]:ARRAY OF y    struct y x[10];        x:ARRAY [0..9] OF y;
  5841. x[10]:STRING        - (1)            x:STRING[10]; (2)
  5842. x[10]:LIST        - (1)            - (1)
  5843.  
  5844. x:REG            register int x;
  5845.  
  5846. OBJECT x        struct x {    (3)    TYPE x = RECORD
  5847.   y:CHAR,z:INT          char y; short z;      y:CHAR; z:INTEGER;
  5848. ENDOBJECT        };            END;
  5849.  
  5850. (1) when translating from E to C, simulate with an array of char/int resp.,
  5851.     and do your own range-checking etc.
  5852. (2) no Wirth Pascal, but available in all popular dialects.
  5853. (3) or public class.
  5854.  
  5855.  
  5856. -----------------------------------------------------------------------
  5857. QUOTED EXPRESSIONS
  5858.  
  5859. E            LISP                MIRANDA
  5860. ----------------------- --------------------------- -------------------
  5861. `e            (QUOTE e)  'e            (3)
  5862.             (LAMBDA () e)     (1)
  5863. `x+y            '(+ x y)
  5864. Eval(`e)        (EVAL `e)
  5865. ForAll(v,l,`e)        - (2)
  5866. MapList(v,l,l,`e)    (MAPCAR (LAMBDA (V) E) L)   map (\v->e) l
  5867.  
  5868. example:
  5869.  
  5870. E:        MapList({x},[1,2,3,4],a,`x*x)
  5871. MIRANDA:    map (\x->x*x) [1,2,3,4]
  5872. LISP:        (MAPCAR (LAMBDA (X) (* X X) `(1 2 3 4))
  5873.  
  5874. (1) really QUOTE, but sometimes used where in LISP LAMBDA would be
  5875.     used, like in MapList()
  5876. (2) not even in ProLog, see other logical languages.
  5877. (3) lazyness would be used instead here
  5878.  
  5879. -----------------------------------------------------------------------
  5880. UNIFICATION AND LISP CELLS
  5881.  
  5882. E            LISP            PROLOG
  5883. ----------------------- ----------------------- -----------------------
  5884. <1|2>            (1 . 2)            [1|2]
  5885. <1,2,3>            (1 2 3)            [1,2,3]
  5886. <1,2|3>            (1 2 . 3)        [1,2|3]
  5887.  
  5888. E            HASKELL            PROLOG
  5889. ----------------------- ----------------------- -----------------------
  5890. e <=> <x|y>        (x:y) = e        e = [X|Y]
  5891. e <=> <1,2,x>        [1,2,x] = e        e = [1,2,X]
  5892. e <=> [1,x]        -            -
  5893.  
  5894.  
  5895. -----------------------------------------------------------------------
  5896. EXCEPTIONS
  5897.  
  5898. E            C++            ADA
  5899. ----------------------- ----------------------- -----------------------
  5900. PROC x() HANDLE        int x() { try {        function x is begin
  5901. EXCEPT            } catch (exc) {   (1)    exception
  5902. EXCEPT DO        -            -
  5903. ENDPROC            }};            end x;
  5904.  
  5905. Raise(e)        throw e;        raise e;
  5906. Throw(e,f)        ?            -
  5907. ReThrow()        throw e;        raise e;
  5908. RAISE "MEM" IF New()=0    -            - (2)
  5909.  
  5910.  
  5911. (1) catch handles only one specific exception, it's quite different
  5912.     from general exception handlers as used in E.
  5913. (2) the runtime system does raise some exceptions, but I'm not sure
  5914.     whether automatically raised exceptions can be _defined_ in Ada.
  5915.  
  5916.  
  5917. -----------------------------------------------------------------------
  5918. OBJECT ORIENTED PROGRAMMING
  5919.  
  5920. E                C++
  5921. ------------------------------- -----------------------
  5922. OBJECT x            class x {
  5923. OBJECT x OF y            class x : y {
  5924. self.i                this->i
  5925. PROC a OF x IS self.i        virtual int x::a() { return i; }
  5926. -                int x::a() { return i; }
  5927. PROC a OF x IS EMPTY        virtual int x::a() =0
  5928. PUBLIC                public:
  5929. a.method(1)            a->method(1)
  5930.  
  5931. [see also next part under NEW]
  5932.  
  5933. -----------------------------------------------------------------------
  5934. BUILTIN FUNCTIONS AND MEMORY ALLOCATION
  5935. (only a few are presented here, as an example)
  5936.  
  5937. E            C/C++            Pascal
  5938. ----------------------- ----------------------- -----------------------
  5939. WriteF(fs,...)        printf(fs,...);        WriteLn(a,b,...);
  5940.             cout << a << b ... ;
  5941.  
  5942. ReadStr(f,s)        scanf(fs,...)        ReadLn(s)
  5943. Val(s)                        Val()
  5944.             cin >> s;
  5945.  
  5946. StrCopy(s,s,n)    (1)    strcpy(s,s)        s:=s; (2)
  5947.  
  5948. Mod(e,e)        e%e            e MOD e
  5949. Shl(e,n)        e<<n            Shl()
  5950. Long(e)            -            -
  5951.  
  5952.  
  5953. p:=New(e)        p=malloc(e);        New(p);
  5954. NEW p            p=new type;
  5955. NEW p.constr()        p=new constr()        -
  5956. NEW [e,f,g]        -            -
  5957. Dispose(p)        free(p);        Dispose(p);
  5958. END p            delete p;
  5959.  
  5960.  
  5961. (1) when translating from C, make sure you turn the arrays of char into
  5962.     proper STRINGs.
  5963. (2) dunno what function is needed in the pointer case.
  5964.  
  5965.  
  5966. 18D. Amiga E FAQ
  5967. ----------------
  5968. [94_10_1..94_12_1]
  5969.  
  5970. This FAQ-list (Frequently Asked Questions) was compiled by looking through
  5971. old email and gathering those questions which keep popping up.
  5972.  
  5973.  
  5974.  
  5975. Compiler/Linking/Executables
  5976.  
  5977. - How can I link E code with other languages? / use standard object format?
  5978.  
  5979.   Converting between .m and .o really isn't a huge problem, as one can see
  5980.   from the o2m utility, which allows cooperation between E and Macro-Assembly
  5981.   quite marvelously. The problem with C is in the compiled code, not the file
  5982.   format. Anything but trivial C will reference things like _DOSBase, link-
  5983.   library functions, stack-bases or other things from startup-code that E
  5984.   provides in a quite different way, for example E's startup code is very
  5985.   different from that of C compilers, and dosbase in E is placed on the stack,
  5986.   not in the exe as with C. Even two C compilers may have these problems.
  5987.   If you can get your C compiler to deliver a .o without external references
  5988.   etc., you can link it with E (I did this once with MaxonC++).
  5989.  
  5990. - Can I link amiga.lib?
  5991.  
  5992.   Currently no. To a lesser extend this has the same problems as .o files,
  5993.   however with the help of an assembler and o2m a .lib file can be translated
  5994.   to .m, infact it already has been done for some. It's only a matter of time
  5995.   before someone does this for (parts of) amiga.lib.
  5996.  
  5997. - Can E code be made resident?
  5998.  
  5999.   Nearly ALL E code is already resident-able without the help of the
  6000.   programmer. As fas as I know, the only E construct that can violate this is
  6001.   a static list [] with an expression in it (so [a], for example. [1] or
  6002.   NEW [a] is ok.).
  6003.  
  6004. - I have this application with pieces of inline asm, and after
  6005.   OPTI/S it behaves weird. what is going on?
  6006.  
  6007.   Inline asm may use the same registers as the register optimizer does.
  6008.   check E.doc for this.
  6009.  
  6010. - I wrote X in both C and E, and the E version is Y times slower/faster.
  6011.   how come?
  6012.  
  6013.   It's not easy to compare both in a fair way. Often it may be the case that
  6014.   one of the two has more optimized routines for something (string handling,
  6015.   I/O etc.). Use of a profiler can reveal this. If the code in question only
  6016.   does calculations, there's no reason why any of the two should be
  6017.   significantly slower than the other, if used properly.
  6018.  
  6019. - I have written this nice 'myutils.m', only when I use one function
  6020.   from it, EC links all. I don't like that.
  6021.  
  6022.   The style of writing modules in E is to keep them as relatively small units,
  6023.   with only related code and data. (This makes more sense if you know that the
  6024.   module is the unit of datahiding in E). Split it up!
  6025.  
  6026. - Can I make EC resident?
  6027.  
  6028.   no, currently not. EC itself is still written in old-fashioned assembly
  6029.   style, and cannot be made resident ;-)
  6030.  
  6031.  
  6032.  
  6033. Resources
  6034.  
  6035. - There's no explanation in the docs of all those handy functions from
  6036.   intuition.library etc. How come?
  6037.  
  6038.   The functions are not part of E, rather they are part of the amiga OS.
  6039.   As such, they are described by Commodore's documents, not by the E documents.
  6040.   "The AMIGA ROM Kernal Reference Manuals" are a series of books published
  6041.   by Addison Wesley. A good place to start for example "Libraries", ISBN
  6042.   0-201-56774-1. Other books are worth considering too, an example is "The
  6043.   Amiga Guru Book" by Ralph Babel.
  6044.  
  6045. - I'd like to read more source code than what comes with the distribution
  6046.   where should I look?
  6047.  
  6048.   There are lots of places too look, but the best is without doubt Aminet
  6049.   (A collection of FTP-sites on the internet), for example ftp.luth.se.
  6050.   In the directory 'pub/aminet/dev/e' you'll find all sorts of E related
  6051.   stuff. Some BBS'es outside of the internet also carry Aminet, and there
  6052.   are even CDROMS available. Another good place to pick up sources and
  6053.   to talk with fellow E programmers is the E mailing list. Send an email
  6054.   with 'HELP' in the body to amigae-request@bkhouse.cts.com to hear all
  6055.   about it. There are E discussion on other nets as well (FidoNet, AmigaNet),
  6056.   public domain disk series (EPD in europe/germany, same address as the german
  6057.   registration site), furthermore there are heaps of user-clubs, BBS's etc.
  6058.   supporting E these days. just look around in your area.
  6059.  
  6060. - I have heard about this mailing list. is it any good?
  6061.  
  6062.   Find out for yourself. If your serious about E it's definitly a must, also
  6063.   because it's the place where news on E is generally released first.
  6064.  
  6065. - I have a hard time getting on the mailing list. Could you take care of that
  6066.   for me?
  6067.  
  6068.   I personally don't have anything to do with the administration of the list,
  6069.   so I can't help out any better than anyone else can. Remember that the
  6070.   server is an automated process, so you need to be very precise in what you
  6071.   send there. Don't send administrative post to the list at large, instead
  6072.   try and get hold of the administrator.
  6073.  
  6074. - I'm new to internet. Could you help me get on the mailing list /
  6075.   FTP files from Aminet etc...?
  6076.  
  6077.   Stuff like that is way beyond my service. Please try and contact someone
  6078.   locally.
  6079.  
  6080. - How do I know what is the latest version / How do I receive it?
  6081.  
  6082.   If you're on the mailing list you'll be the first to know. Aminet is the
  6083.   place where releases and updates are uploaded first. Registered users get
  6084.   updates/notices automatically in their mbox.
  6085.  
  6086. - How do I register?
  6087.  
  6088.   please read E.doc on this.
  6089.  
  6090. - Does E exist for other platforms?
  6091.  
  6092.   Not Yet. Personally I have undertaken small project to make portable
  6093.   compilers/translators, and several others have E compiler projects on other
  6094.   platforms, but nothing has come out of this so far.
  6095.  
  6096. - Can I become an E registration site for country X?
  6097.  
  6098.   Generally I pick sites myself, when I feel the necessity, and know someone
  6099.   in that country pretty well.
  6100.  
  6101. - Can I start an E support BBS / an E programming club...?
  6102.  
  6103.   You can always do that, without asking me. I of course enjoy hearing about
  6104.   efforts like this...
  6105.  
  6106.  
  6107.  
  6108. Programming
  6109.  
  6110. - Can I do X in E? (where X = {games,dtp-packages,...})
  6111.  
  6112.   E is a general purpose programming language, so there shouldn't be any type
  6113.   of program that can't be done in E (with few rare exceptions, which are covered
  6114.   by E's inline asm). This doesn't mean E is especially equipped for certain
  6115.   types of programs, i.e. E has no special functions for games (though its
  6116.   extensibility makes it easy to add them).
  6117.  
  6118. - How do I create X in E (where X = {window, interupt handler,...})
  6119.  
  6120.   as with the last question, E just opens the possibilities to write anything,
  6121.   and there isn't always a specific function available. In the worst case this
  6122.   means having to use difficult functions from spooky libraries, but it's
  6123.   worth it getting to grips with that. If you're lucky some E programmer
  6124.   already has done something similar which you can learn from.
  6125.  
  6126. - Please write me an example how to do X in E.
  6127.  
  6128.   Please try to figure it out yourself first, or ask other E programmers to
  6129.   help out.
  6130.  
  6131. - The compiler refuses to compile things like myscreen.rastport.bitmap,
  6132.   eventhough x.y.z is generally possible. Why is that?
  6133.  
  6134.   to be able to dereference that last .bitmap, the compiler needs to know the
  6135.   type of the expression myscreen.rastport. And if you look at the module
  6136.   'intuition/screens.m' you'll see that the rastport field has no type.
  6137.  
  6138. - ... if that is so, why don't we have new correctly typed modules?
  6139.  
  6140.   Because the assembly includes (.i) from which the E modules are converted
  6141.   don't contain that information. It's not possible to use C .h files either,
  6142.   since to some extend they use other identifiers, and thus would break
  6143.   backward compatability.
  6144.  
  6145. - ... so what do I do then?
  6146.  
  6147.   The classical method was to load x.y into a typed pointer, and then
  6148.   reference .z with that. With pointer typing in v3, you can also dereference
  6149.   it directly (go and see E.doc).
  6150.  
  6151. - I'm writing code like this:
  6152.  
  6153.     DEF s[100]:STRING
  6154.     s:='my beautiful string'
  6155.  
  6156.   which is allowed by the compiler, but later gives me problems. What can possibly
  6157.   be wrong with this?
  6158.  
  6159.   If you're used to for example BASIC, you're used to handle strings in the
  6160.   same way as integers, as they are both _values_. In E however there are no
  6161.   real string variables in the BASIC sense, the DEF above creates a piece of
  6162.   memory to hold a string, then sets the variable as a pointer to this memory.
  6163.   The pointer and the memory are implementation-wise two unrelated entities.
  6164.   From that DEF on, all operation that directly access 's' access the pointer,
  6165.   which is just an integer which tells us were to find the actual string.
  6166.   The assignment thus puts the address of 'my beautiful string' into 's',
  6167.   overwriting the old value. The string-memory created by the DEF sits there
  6168.   unaltered, and now unaccessable because no pointer points to it. Functions
  6169.   like StrCopy() can use this pointer to find the real memory, and can fill
  6170.   it:
  6171.  
  6172.     StrCopy(s,'my beautiful string')
  6173.  
  6174.   is correct. Of course assigning strings as pointers also has a use, for
  6175.   example if you just want to read the string data and do nothing else with
  6176.   it. then:
  6177.  
  6178.     DEF s:PTR TO CHAR
  6179.  
  6180.   allocates no memory for a string, only the pointer. the assignment above
  6181.   would now make sense. This all boils down to the differences between
  6182.   pointers and values (or value/reference semantics), and is important to
  6183.   understand to succesfully program in E.
  6184.  
  6185. - How do I return a STRING / OBJECT etc. from a function?
  6186.  
  6187.   depends. If you just wish to use it as temporary return value, give a string
  6188.   as argument and let the routine fill it. If you need to create a NEW string/
  6189.   object, allocate it dynamically within the function, and return the pointer.
  6190.  
  6191. <more of these specific questions are to be added>
  6192.  
  6193.  
  6194.  
  6195. Bugs
  6196.  
  6197. - I remember programming something when suddenly the compiler crashed/
  6198.   misbehaved/produced an internal error/gave wrong error messages. shouldn't
  6199.   you be doing something about this?
  6200.  
  6201.   If I have no clue where to look for a bug I can't fix it. If you stumble
  6202.   across something that you're sure of is a compiler bug, make a copy of
  6203.   the source that reproduces the bug (possibly cut the source down while
  6204.   making sure it still shows the bug) and send it to me with as much info
  6205.   as possible. EC-enforcer hits for example are very useful.
  6206.  
  6207. - I wrote program X, but it crashes. I'm positive I made no mistakes,
  6208.   so certainly this must be a compiler bug.
  6209.  
  6210.   due to E's untyped-ness, you can never be quite sure you're code is
  6211.   correct. Most code send to me with comments like the above later proved
  6212.   to be errors in the code, mostly due to lock of E knowledge. Read the
  6213.   docs, and use EDBG!
  6214.  
  6215.  
  6216.  
  6217. Future Features
  6218.  
  6219. Will E have...
  6220. - Registerised arguments?
  6221.  
  6222.   It surely is possible but like many things it's not a priority for me.
  6223.  
  6224. - Library/Device linker?
  6225.  
  6226.   I would have done this already if it weren't for E's way of storing global
  6227.   variables (on the stack), which complicates things a lot. This'll just need
  6228.   a little time.
  6229.  
  6230. - Multiple Inheritance?
  6231.  
  6232.   Not possible in E. MI breaks with structural compatability between objects,
  6233.   and needs relatively strong typing to resolve this.
  6234.  
  6235. - PROCs inside PROCs?
  6236.  
  6237.   Not likely.
  6238.  
  6239. - multidimensional arrays?
  6240.  
  6241.   Not likely either. In E there isn't really something like an array, just
  6242.   pointers that point to a large amounts of equally sized objects. To have
  6243.   twodimensional arrays, one needs to have the concept of 'size' of an array,
  6244.   which E doesn't have.
  6245.  
  6246. - more 020/881 support?
  6247.  
  6248.   Yes, eventually. It just isn't at the top of my TODO-list.
  6249.  
  6250. - C compatible syntax?
  6251.  
  6252.   Often people are used to some type of language (mostly C), and don't
  6253.   understand why a programming language design isn't as configurable as a
  6254.   directory utility or text editor:
  6255.   'I like "=="/"=" better than "="/":="'
  6256.   'Can't you switch """ and "'" ?'
  6257.   'Why doesn't "--" work as in C?'
  6258.   'I hate typing CAPS for keywords!'
  6259.   'No precedence sucks!'
  6260.   The features 'referenced' above will never change, and you'd better get use
  6261.   to it. All design decisions have very good reasons, and unlike some rumours
  6262.   they were not done for compiler speed (infact implementing them more
  6263.   traditionally wouldn't make the compiler any slower).
  6264.  
  6265. - Why is feature X in E not like language Y, which I find better.
  6266.  
  6267.   Like above, the design of a language isn't changed just because of
  6268.   personal preference. If you have strong ideas of what a language should
  6269.   look like according to you, and those ideas stem from language Y, then
  6270.   use Y. If you can't find your ideas in any existing language, then it's
  6271.   time to design and implement your own! (I'm not kidding, it's worth the
  6272.   trouble! and you can always start with E... :-)
  6273.  
  6274. - X maybe?
  6275.  
  6276.   Having seen literally hundreds of programming languages, your chances of
  6277.   suggesting a new feature for E which I haven't thought of before are not
  6278.   too bright. Many things don't 'fit' into E, and in general time is limited
  6279.   to add more fancy stuff. (If you look closely, the amount of features in
  6280.   E is already quite high for an average programming language). I have quite
  6281.   a huge list of possible features for E, and eventually some of these will
  6282.   be implemented. just wait and see...
  6283.  
  6284.  
  6285.  
  6286.  
  6287. -------------------------------EOF--------------------------------------
  6288.