TweetFollow Us on Twitter

Threaded News
Volume Number:6
Issue Number:5
Column Tag:Jörg's Folder

Threaded News

By Jörg Langowski, MacTutor Editorial Board

MacForth Plus 4.0; NEON news

And here we are back with a “real” Forth column again. Just in time, it seems; only when I read on GEnie recently “It is too bad that he was seduced by the dark side of the force” about my recent excursions into other domains I realized that the true believers might have been disappointed. But please realize, there is only so much space in our magazine, and we have to try and cover a great variety of subjects.

A new version of MacForth Plus (v 4.0) has arrived here; with lots of improvements, notably faster execution and compilation, the possibility to generate stand-alone code, and some rudimentary but very efficient object-oriented extensions. Before I tell you more about it, I’d like to show you that there are still some people out there using NEON, and improving it. I received the following note from a reader in Australia:

“Dear Jörg,

I was delighted to read in your October column in MacTutor, that some people are still using NEON. I thought I was the only one! I enclose a copy of a letter I have sent to Bob Loewenstein, for your interest.

Yours sincerely,

Michael Hore

5/137 Elouera Rd.

Cronulla, NSW 2230, Australia”.

The copy of Mike’s letter follows:

“Dear Bob,

I’ve just read your comments on NEON in the October issue of MacTutor (which takes a while to arrive on the newsstands here). I was amazed (and delighted) to see that there are still a number of folks using NEON - I thought I might be the only one! I have always thought that this was the most underrated development system for the Mac. A good product with potential to be a great one, but torpedoed by a marketing strategy which bordered on the nonexistent.

I also found no problem running on a Mac II - my personal finances don’t run to one, but I had a report that an application that I wrote in NEON worked OK on a Mac II. Like you I found I had to set a larger stack size than the default - unless I set at least 7K I got random crashes, usually during Standard File calls. Maybe this was the cause of the problems others ran into.

I also started to develop NEON, but thinking I was about the only user I took a more radical line than you - I completely reimplemented the nucleus from scratch. It now compiles subroutine-threaded code, with optimized native code for common sequences. The result is that applications run 4-5 times faster, and are about 10% smaller. The compilation speed is now over 1000 LPM. The whole assembler compiles in about a minute. I’ve also introduced quite a few improvements to the high-level code - at least I think they are improvements. Multiple inheritance, for example. I thought the changes were radical enough to justify a change of name, so now I’m calling it Mops (Michael’s Object-oriented Programming System!)

My understanding of copyright legalities is that the Mops nucleus, being completely new, would not violate Kriya’s copyright on NEON. That is unless a language, as such, is copyrightable, rather than the specific code which comprises a specific implementation. I think it probably isn’t copyrightable, but I’m not a lawyer. But since I haven’t changed all the high-level code, Kriya still definitely hold the copyright to that (unless you were able to persuade them to release it into the public domain - how did you get on?). But I’m quite happy to send Mops to anyone who has NEON, since that doesn’t involve legal problems. In any case, I don’t have the time or inclination to document Mops from scratch for someone unfamiliar with NEON. I will produce a file listing the changes between Mops and NEON, if anyone wants Mops. If I’m the copyright holder on the Mops nucleus, my only conditions are that it not be used for commercial purposes without my permission.

So if you or any other NEON users are interested in giving Mops a try, just write me, or better, send me a disk with some of your NEON developments on it, and I’ll send it back to you with Mops. Sorry for the horse and buggy method, but distance precludes electronic transfer. Perhaps you could do me a favor and post some of this letter on some appropriate bulletin board, in case anyone might be interested.

Of course, if your NEON code makes much use of implementation details of NEON, like expecting certain things to be at CFAs or whatever, it won’t work under Mops without rewriting. Also, I took a different line on floating point. Actually, this was only experimental since I don’t need FP in my work - it’s all string handling. NEON FP is very implementation-dependent, so a fair bit of work would have to be done to get existing FP code to work under Mops. But it certainly could be done.

Apart from that, the main differences from NEON are in the direction of improving the error checking, and also in bringing the underlying Forth more in line with Forth 83 and the forthcoming ANSI standard. Most of the necessary changes to NEON code can be done semi-mechanically. I found the most troublesome was the change in boolean “true” from 1 to -1. If you don’t often do arithmetic on booleans, you won’t have much trouble.

I’ve also tried to make Mops 32-bit clean, and it seems to work OK on new Macs. At least it worked on a friend’s SE/30 (which cheered me up, and slightly compensated for the green colour of my face).

I haven’t had time yet to update all the various NEON utilities, or the classes that I don’t actually use. But I have updated all the standard stuff, implemented a modeless dialog class, and written a new decompiler/debugger. I also have code that will read and write formatted Microsoft Word documents, if that’s any use to anybody.

Looking forward to hearing from you,

Yours sincerely,

Michael Hore.”

I have checked back with Bob Loewenstein <rfl@tycho.yerkes. uchicago. edu>, who is sending me his NEON extensions for review. You’ll hear about it in one of the next columns. It also seems that Kriya is still planning to release NEON into the public domain, but that there were some legal problems that had to be fixed before they could actually go ahead with it. There may be a chance that NEON is actually public domain at the time you read this.

MacForth 4.0

It is a long time since I wrote something about MacForth; that was when version 3.53 came out. Mainly because of the closer machine-orientation of Mach2, and also due to my non-access to Compuserve’s MacForth forum, I preferred to write my Forth examples in Mach2. Also, we had hardly any feedback from the MacForth community in the form of articles we could publish. However, that does not mean that Creative Solutions and the MacForth users group have been asleep. Just now, a thick binder with the 4.0 manual and diskettes arrived here, and I’ll give you some of my impressions. I cannot possibly cover all the features here, because of sheer quantity; I’ll only talk about the important new improvements. The two changes that are most visible compared to the previous version (3.53) are the support of stand-alone code, and active elements, a sort of object orientation.

Stand-alone code

The great advantage of Mach2 over MacForth has always been that Mach2 created true 68000 code through its subroutine-threading mechanism. Therefore, it was easily possible to create stand-alone code resources in Forth, as we have seen in various examples of XCMDs, MDEFs, FKEYs and DRVRs. A token-threaded Forth like MacForth has much greater difficulties to create stand-alone code, because the Forth code needs an interpreter to be executed.

Fortunately, MacForth’s interpreter is very small, it consists of two instructions:

 MOVE.W (A2)+,D3
 JMP  0(A6,D3.W)

where A2 is the instruction pointer and A6 contains the base address of the MacForth kernel. The interpreter, the token-threaded Forth code, and some entry and exit code together will constitute a stand-alone code resource (SA) which can - for instance - be called by a toolbox routine which requires a filter procedure.

The process of creating SAs is very simple. Let’s assume you have a Forth definition that you want to convert into an SA, such as

: beeper 10 sysbeep ;

After loading the SA maker file (which contains all the source to the SA compiler), you simply type SA beeper. This initiates a rather complicated process, where the Forth definition is analyzed: a list is created of all tokens used, and the definitions of all these tokens copied into the target area. Of course, this process is recursive, because the copied tokens may call other tokens, etc. The token values of all definitions have to be changed during this process, because tokens are actually offset addresses from the base of the kernel, and all those offsets will have changed.

One can follow the compilation process when the debug option is on; a message will be printed out as each Forth word is copied into the target area and the token addresses are changed.

The stand-alone support code included with MacForth is very complete; examples are given for I/O (Forth I/O does not work from SAs, of course), floating point handling, and debugging. Other files contain code used for generating drivers/DAs and XCMDs/XFCNs. For the latter, interfaces are also given to the Hypercard XCMD callback routines.

A simple example of an XCMD which beeps a number of times depending on the first parameter is given below:

\ 1

: nbeep \ MacForth XCMD to beep n times
 paramCount 0= IF 0 return EXIT THEN
 0 locals| HANDLE |
 0 param -> handle
 handle lock.handle
 handle h@  \ convert to address
 xcmdPad ZeroToPas \ convert to Pascal string
 xcmdPad StrToNum  \ convert to a number
 0 do 10 sysbeep loop\ beep n times
 handle unlock.handle
 handle dispose.handle
 0 return

To convert this code into an XCMD, you simply type


xcmd nbeep
2000 “ nbeep” store.xcmd

and the XCMD resource will be left in the “Resource Bag” file where all standard resources of MacForth are stored. Included on the source code disk is a Hypercard stack with which you can try out this XCMD.

Actels - a simple OOP system

MacForth 4.0 now includes support for a simple late-binding message-passing mechanism to objects, which CSI calls actels (short for active elements). Like classical objects, actels are data structures bundled with the procedures that operate on the data. When messages are passed to an actel, an appropriate procedure will be invoked, depending on the message; when no method corresponding to the message can be found, the message is passed on to the parent object in the hierarchy. So far, just like standard object-oriented behavior; the difference is that the behavior of an actel is much less defined initially than that of objects in other languages. For instance, classes as such don’t really exist; to create a new class of actels, you define a prototype, which should be copied and initialized when it receives the >>New message. It is up to you to define this behavior; there is no generic ‘object class’ for which some default behavior is implemented.

To make this more understandable, let me describe how the example on the MacForth disk implements matrix actels. First, a data structure is defined, which contains a 16 byte header and cells that hold the row and column size; no space for storing the data is defined yet:

\ 3

 minElemHeaderSize + \ generic header info
 short: +#ROWS   \ number of rows
 short: +#COLS   \ number of columns
 0 bytes: +DATA  \ variable amount of data

The first four bytes of the header contain a jump to the method selector corresponding to the actel. The data following the header are the instance variables; the length of the instance variable list is stored in the header. You are responsible for initializing the actel prototype, which means storing the jump to the method selector and the instance variable length in the header, and initializing the other variables.

Messages to actels and the corresponding methods can be defined very simply: each message corresponds to a number, but normally you don’t need to know that number once the message is defined. For example, the messages to the matrix actels are defined as follows:

2000 message >>RC@
2001 message >>RC!
2002 message >>M+
2003 message >>M*

As a convention, names of messages start with “>>”.

Selectors for matrix actels would look somewhat like the following. First, we define the low-level methods that respond to some default messages, their numbers start with 1:

\ 4

1 selector: LowWMatrix    ElemPanic\ no parent
 WMatNew\ >>New
 to.heap\ >>Discard 
 drop   \ >>Empty 
 inherited  \ >>Room 

The first element in the list is the name of the method that is invoked when the message can’t be handled by this actel. Since there is no parent object, we use the generic ElemPanic procedure, which displays an error message. Messages number 1-4 are predefined by MacForth, but their behavior is not; the next four elements in the selector list are Forth words that define the behavior.

Similarly, we define a selector list for our newly defined messages to matrix actels, their numbers start with 2000:

\ 6

2000 selector: HighWMatrix
 LowWMatrix \ parent
 RCW@  RCW!  M+   M*
 \ see message descriptions above

The header of our matrix actel prototype must then contain a jump to the highest-level selector, HighWMatrix.

When a new instance of an actel is created, the header and instance variables are copied into a new heap object of the appropriate size. That heap object can then be re-sized, for instance to accommodate more rows and columns.

Methods are invoked on actels by pushing the actel’s handle on the stack and calling the message: for instance a b >>M+ for adding the matrices a and b.

You see from this brief overview that actels in MacForth Plus provide a very general way of implementing object-oriented behavior; the ‘disadvantage’ is that much of the details are left to the programmer, but I see this rather as a great advantage since it offers great flexibility in defining the behavior of objects. Very Forth-like, because a. it restricts the programmer in the least possible way and b. of course, it will allow you to do the most stupid things without great difficulty. But then, if you want a safety net, you can always resort to C++


Speed of code execution, as you recall, has always been one of my major concerns in judging development systems on the Mac. Therefore, the overview of MacForth would not be complete without giving you the results of some benchmarks. The good news is that MacForth now comes close to Mach2 in execution speed, the bad news of course that it is not quite there yet. You have to pay a price for token-threaded code. Nevertheless, the Sieve benchmark - with local variables and some optimized words - executes in 2.9 seconds on a MacIIx. Mach2, with its built-in words, takes 2.0 seconds. If one optimizes the sequences i c@ , 0 i c! , and i + in Mach2 by defining the code words ic@ , 0ic! , and i+ like in MacForth, Mach2 will take 1.95 seconds - the built-in optimization of Mach2 is quite good. Under MacForth, the sieve version without the optimized words executes in 3.6 seconds.

Floating point execution speed, which has been a major concern for the previous version of MacForth, has now been greatly improved; a 68881 version of the floating point words is included, and now there is almost no speed difference for executing standard floating point operations between Mach2 and MacForth. The old MacForth floating point routines which use the SANE package, however, still have quite some overhead for empty loops.

Compilation speed in MacForth Plus is very fast; I see a noticeable difference to the old version, and the documentation says there is an increase in speed by a factor of 3-5. Part of this improvement is because of changes in the vocabulary structure; vocabularies have a completely new internal structure, they are hash-coded and are actel, thus inserting a new word into a vocabulary means sending a message to it. These vocabularies are much smarter than the previous ones; for instance, they automatically resize themselves when they run out of space.


There are many more improvements in the new MacForth, but these are the major ones. Stand-alone code, a domain previously only covered by Mach2 Forth, can now be created by MacForth as well, and there are very efficient tools provided with the system to help programming such stand-alone code. Together with the object-orientation mechanism provided by the actels, and the great variety of programming aids and examples provided, MacForth’s new version provides one of the best compromises between versatility, speed of development and speed of execution that I know of in a Macintosh development system. Of course, any Forth programmer will affirm that only a Forth development system will be able to offer such a good balance between flexibility, simplicity and speed, (everybody here knows that’s my opinion, anyway), but that’s another story. My personal preference for ‘close-to-the-toolbox’ programming still remains Mach2, also because of its good assembler, but for Forth programmers who prefer a very extensive set of words and tools that provide a very high-level access to the Macintosh, MacForth is the system of choice. CSI’s user support, through upgrades, newsletters, and the Compuserve Forth forum, is excellent, and if the examples on the MacForth disks don’t satisfy you, you can find orders of magnitude more on Compuserve. If only Palo Alto Shipping’s Mach2 support on GEnie were a little more active lately, one hasn’t heard much of them.

Anyway, you see, the Forth is still with us.

Apple Inc.
Microsoft Corpora
Google Inc.

MacTech Search:
Community Search:

Software Updates via MacUpdate

Acorn 4.4 - Bitmap image editor. (Demo)
Acorn is a new image editor built with one goal in mind - simplicity. Fast, easy, and fluid, Acorn provides the options you'll need without any overhead. Acorn feels right, and won't drain your bank... Read more
Bartender 1.2.20 - Organize your menu ba...
Bartender lets you organize your menu bar apps. Features: Lets you tidy your menu bar apps how you want. See your menu bar apps when you want. Hide the apps you need to run, but do not need to... Read more
TotalFinder 1.6.2 - Adds tabs, hotkeys,...
TotalFinder is a universally acclaimed navigational companion for your Mac. Enhance your Mac's Finder with features so smart and convenient, you won't believe you ever lived without them. Tab-based... Read more
Vienna 3.0.0 RC 2 :be5265e: - RSS and At...
Vienna is a freeware and Open-Source RSS/Atom newsreader with article storage and management via a SQLite database, written in Objective-C and Cocoa, for the OS X operating system. It provides... Read more
VLC Media Player 2.1.5 - Popular multime...
VLC Media Player is a highly portable multimedia player for various audio and video formats (MPEG-1, MPEG-2, MPEG-4, DivX, MP3, OGG, ...) as well as DVDs, VCDs, and various streaming protocols. It... Read more
Default Folder X 4.6.7 - Enhances Open a...
Default Folder X attaches a toolbar to the right side of the Open and Save dialogs in any OS X-native application. The toolbar gives you fast access to various folders and commands. You just click... Read more
TinkerTool 5.3 - Expanded preference set...
TinkerTool is an application that gives you access to additional preference settings Apple has built into Mac OS X. This allows to activate hidden features in the operating system and in some of the... Read more
Audio Hijack Pro 2.11.0 - Record and enh...
Audio Hijack Pro drastically changes the way you use audio on your computer, giving you the freedom to listen to audio when you want and how you want. Record and enhance any audio with Audio Hijack... Read more
Intermission 1.1.1 - Pause and rewind li...
Intermission allows you to pause and rewind live audio from any application on your Mac. Intermission will buffer up to 3 hours of audio, allowing users to skip through any assortment of audio... Read more
Autopano Giga 3.6 - Stitch multiple imag...
Autopano Giga allows you to stitch 2, 20, or 2,000 images. Version 3.0 integrates impressive new features that will definitely make you adopt Autopano Pro or Autopano Giga: Choose between 9... Read more

Latest Forum Discussions

See All

Traps n’ Gemstones Review
Traps n’ Gemstones Review By Campbell Bird on July 28th, 2014 Our Rating: :: CASTLEVANIA JONESUniversal App - Designed for iPhone and iPad Fight mummies, dig tunnels, and ride a runaway minecart to discover ancient secrets in this... | Read more »
The Phantom PI Mission Apparition Review
The Phantom PI Mission Apparition Review By Jordan Minor on July 28th, 2014 Our Rating: :: GHOSTS BUSTEDUniversal App - Designed for iPhone and iPad The Phantom PI is an exceedingly clever and well-crafted adventure game.   | Read more »
More Stubies Are Coming Your Way in a Ne...
More Stubies Are Coming Your Way in a New Update Posted by Jessica Fisher on July 28th, 2014 [ permalink ] Universal App - Designed for iPhone and iPad | Read more »
The Great Prank War Review
The Great Prank War Review By Nadia Oxford on July 28th, 2014 Our Rating: :: PRANKING IS SERIOUS BUSINESSUniversal App - Designed for iPhone and iPad Though short, The Great Prank War offers an interesting and fun mix of action and... | Read more »
Marvel Contest of Champions Announced at...
Marvel Contest of Champions Announced at Comic-Con Posted by Jennifer Allen on July 28th, 2014 [ permalink ] Announced over the weekend at San Diego Comic-Con was the fairly exciting looking Marvel Contest of Champions. | Read more »
Teenage Mutant Ninja Turtles Review
Teenage Mutant Ninja Turtles Review By Jennifer Allen on July 28th, 2014 Our Rating: :: DULL SWIPINGUniversal App - Designed for iPhone and iPad The pizza power is weak when it comes to this Teenage Mutant Ninja Turtles game.   | Read more »
Exploration Focused Puzzle Game Beatbudd...
Exploration Focused Puzzle Game Beatbuddy Set to Make Transition from PC to iOS this September Posted by Jennifer Allen on July 28th, 2014 [ permalink ] | Read more »
PlanetHD By Nadia Oxford on July 28th, 2014 Our Rating: :: SPACE MADNESSUniversal App - Designed for iPhone and iPad PlanetHD will keep players busy for a while, though its unpredictable physics are a handful to deal with.   | Read more »
This Week at 148Apps: July 21-25, 2014
Another Week of Expert App Reviews   At 148Apps, we help you sort through the great ocean of apps to find the ones we think you’ll like and the ones you’ll need. Our top picks become Editor’s Choice, our stamp of approval for apps with that little... | Read more »
Reddme for iPhone - The Reddit Client (...
Reddme for iPhone - The Reddit Client 1.0 Device: iOS iPhone Category: News Price: $.99, Version: 1.0 (iTunes) Description: Reddme for iPhone is an iOS 7-optimized Reddit client that offers a refreshing new way to experience Reddit... | Read more »

Price Scanner via

13-inch 2.5GHz MacBook Pro on sale for $1099,...
Best Buy has the 13″ 2.5GHz MacBook Pro available for $1099.99 on their online store. Choose free shipping or free instant local store pickup (if available). Their price is $100 off MSRP. Price is... Read more
Roundup of Apple refurbished MacBook Pros, th...
The Apple Store has Apple Certified Refurbished 13″ and 15″ MacBook Pros available for up to $400 off the cost of new models. Apple’s one-year warranty is standard, and shipping is free. Their prices... Read more
Record Mac Shipments In Q2/14 Confound Analys...
A Seeking Alpha Trefis commentary notes that Apple’s fiscal Q3 2014 results released July 22, beat market predictions on earnings, although revenues were slightly lower than anticipated. Apple’s Mac’... Read more
Intel To Launch Core M Silicon For Use In Not...
Digitimes’ Monica Chen and Joseph Tsai, report that Intel will launch 14nm-based Core M series processors specifically for use in fanless notebook/tablet 2-in-1 models in Q4 2014, with many models to... Read more
Apple’s 2014 Back to School promotion: $100 g...
 Apple’s 2014 Back to School promotion includes a free $100 App Store Gift Card with the purchase of any new Mac (Mac mini excluded), or a $50 Gift Card with the purchase of an iPad or iPhone,... Read more
iMacs on sale for $150 off MSRP, $250 off for...
Best Buy has iMacs on sale for up to $160 off MSRP for a limited time. Choose free home shipping or free instant local store pickup (if available). Prices are valid for online orders only, in-store... Read more
Mac minis on sale for $100 off MSRP, starting...
Best Buy has Mac minis on sale for $100 off MSRP. Choose free shipping or free instant local store pickup. Prices are for online orders only, in-store prices may vary: 2.5GHz Mac mini: $499.99 2.3GHz... Read more
Global Tablet Market Grows 11% in Q2/14 Notwi...
Worldwide tablet sales grew 11.0 percent year over year in the second quarter of 2014, with shipments reaching 49.3 million units according to preliminary data from the International Data Corporation... Read more
New iPhone 6 Models to Have Staggered Release...
Digitimes’ Cage Chao and Steve Shen report that according to unnamed sources in Apple’s upstream iPhone supply chain, the new 5.5-inch iPhone will be released several months later than the new 4.7-... Read more
New iOS App Helps People Feel Good About thei...
Mobile shoppers looking for big savings at their favorite stores can turn to the Goodshop app, a new iOS app with the latest coupons and deals at more than 5,000 online stores. In addition to being a... Read more

Jobs Board

*Apple* Solutions Consultant (ASC) - Apple (...
**Job Summary** The ASC is an Apple employee who serves as an Apple brand ambassador and influencer in a Reseller's store. The ASC's role is to grow Apple Read more
Sr. Product Leader, *Apple* Store Apps - Ap...
**Job Summary** Imagine what you could do here. At Apple , great ideas have a way of becoming great products, services, and customer experiences very quickly. Bring Read more
*Apple* Solutions Consultant (ASC) - Apple (...
**Job Summary** The ASC is an Apple employee who serves as an Apple brand ambassador and influencer in a Reseller's store. The ASC's role is to grow Apple Read more
*Apple* Solutions Consultant (ASC) - Apple (...
**Job Summary** The ASC is an Apple employee who serves as an Apple brand ambassador and influencer in a Reseller's store. The ASC's role is to grow Apple Read more
WW Sales Program Manager, *Apple* Online St...
**Job Summary** Imagine what you could do here. At Apple , great ideas have a way of becoming great products, services, and customer experiences very quickly. Bring Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.