buy cheap doxycycline online
cheapest synthroid prices
xanax without prescription
cheap prozac tablets
cheap tramadol
acomplia
zithromax pharmacy
tramadol without a prescription
phentermine pills
buy generic accutane
where to buy cialis
cheap zoloft online
doxycycline prices
cheap generic phentermine
nexium online cheap
cheap synthroid tablets
acomplia online
nexium pills
buy cheap propecia
buy plavix
buy diazepam without prescription
accutane online stores
accutane cheap
cheap generic viagra
clomid without prescription
cheap plavix
buy bactrim without prescription
tramadol online
phentermine without prescription
buy synthroid
diazepam online stores
discount diazepam
nexium online stores
bactrim online stores
order diazepam
purchase lasix online
purchase lorazepam
bactrim prescription
buy cheap tramadol
zithromax online
cheap acomplia
generic phentermine
plavix for sale
cheap plavix tablets
cheap tramadol tablets
pharmacy lasix
lasix sale
pharmacy diazepam
buy doxycycline
accutane prices
buy cheap phentermine
lasix prices
buy cheap nexium
synthroid for sale
plavix discount
buy doxycycline cheap
lowest price alprazolam
cheap lorazepam online
nexium cheap
cheap generic cialis
discount propecia
pharmacy prozac
soma discount
soma online
buy generic flagyl
discount nexium
cheapest tramadol prices
discount viagra
levitra generic
buy accutane cheap
synthroid pharmacy
where to buy phentermine
acomplia pills
viagra sale
bactrim pharmacy
buy accutane without prescription
lowest price acomplia
buy lorazepam cheap
buy phentermine without prescription
diazepam for sale
cheapest clomid
valium prices
buy prozac online
tramadol sale
clomid online
synthroid cheap
cheap alprazolam online
order soma online
buy zithromax
phentermine no prescription
where to buy lorazepam
accutane online
where to buy bactrim
propecia cheap
cheapest valium prices
pharmacy lorazepam
bactrim for sale
price of soma
buy cialis
order bactrim online
lorazepam without prescription
zoloft without prescription
lowest price diazepam
pharmacy clomid
cheap propecia
buy levitra cheap
purchase soma online
purchase prozac
order zithromax
valium no prescription
valium
prozac prices
nexium generic
zoloft cheap
cheap generic prozac
order doxycycline online
diazepam pills
levitra
accutane no prescription
buy lorazepam
tramadol prices
online doxycycline
where to buy synthroid
buy alprazolam online
alprazolam prescription
zoloft
buy cheap flagyl online
zithromax pills
online valium
acomplia cheap
plavix pills
cheap zithromax online
levitra online stores
lorazepam pills
order flagyl online
doxycycline prescription
cheap lorazepam
buy acomplia
discount acomplia
cheapest prozac prices
alprazolam without a prescription
online synthroid
cheap phentermine tablets
alprazolam
order clomid online
cheapest diazepam prices
zoloft for sale
viagra pharmacy
buy cheap lorazepam online
clomid online cheap
pharmacy tramadol
buy cheap soma
purchase clomid online
cheap doxycycline
purchase prozac online
purchase cialis
flagyl prescription
diazepam prices
viagra online stores
accutane
prozac pharmacy
bactrim generic
buy zoloft without prescription
lowest price flagyl
clomid pills
buy clomid online
cialis pharmacy
pharmacy phentermine
price of clomid
buy acomplia online
price of prozac
phentermine
online tramadol
buy lasix online
levitra without prescription
buy cheap xanax online
cheapest propecia prices
cheapest acomplia prices
buy lorazepam online
cheap generic xanax
accutane without a prescription
synthroid without prescription
order plavix
flagyl without a prescription
buy generic clomid
lowest price lorazepam
order soma
order zoloft online
propecia sale
synthroid discount
pharmacy cialis
price of lasix
prozac pills
tramadol without prescription
valium pharmacy
purchase zoloft online
buy cheap lorazepam
accutane for sale
lowest price clomid
levitra no prescription
synthroid sale
nexium prices
lowest price nexium
generic lorazepam
purchase synthroid
xanax online cheap
purchase bactrim
cheapest alprazolam
synthroid generic
cheap xanax
cheap generic acomplia
buy cheap lasix online
accutane pharmacy
alprazolam pills
cheap valium online
lowest price cialis
plavix generic
buy levitra online
tramadol online stores
buy cheap nexium online
zithromax
lorazepam online stores
acomplia no prescription
lorazepam cheap
bactrim no prescription
buy plavix online
lasix generic
purchase clomid
buy cheap zoloft online
buy generic xanax
doxycycline online cheap
lorazepam online cheap
cialis online cheap
zithromax for sale
generic lasix
cheapest synthroid
generic nexium
purchase phentermine online
prozac generic
order prozac online
clomid prices
where to buy tramadol
price of phentermine
phentermine prescription
lowest price propecia
cialis online stores
discount plavix
cheap diazepam
soma generic
cheapest viagra prices
cheapest bactrim prices
buy cheap flagyl
lorazepam pharmacy
buy diazepam online
propecia discount
buy valium
buy zithromax without prescription
buy generic tramadol
order levitra
valium discount
nexium online
discount doxycycline
bactrim cheap
propecia prices
plavix prices
online nexium
clomid generic
synthroid
buy cheap prozac online
lasix online stores
buy cheap valium online
cheap xanax tablets
xanax without a prescription
buy soma online
cheap phentermine online
where to buy prozac
where to buy alprazolam
buy cheap plavix online
order phentermine
generic clomid
buy tramadol cheap
prozac
cheap propecia tablets
generic xanax
purchase zithromax
levitra online
purchase viagra
propecia generic
generic synthroid
buy cheap alprazolam online
where to buy propecia
acomplia without prescription
cheapest diazepam
order lorazepam
xanax discount
where to buy zithromax
cheap diazepam tablets
price of cialis
cheap generic lasix
order flagyl
buy clomid without prescription
diazepam online cheap
order accutane
zithromax without prescription
doxycycline cheap
lasix online cheap
cheapest plavix
alprazolam online
buy cheap clomid online
buy generic zithromax
levitra for sale
buy cheap acomplia
doxycycline online stores
purchase flagyl online
nexium
generic plavix
pharmacy nexium
price of alprazolam
purchase nexium online
buy generic cialis
cheap flagyl tablets
buy cheap bactrim online
buy alprazolam cheap
soma sale
buy generic synthroid
phentermine sale
plavix pharmacy
buy viagra online
xanax
purchase cialis online
pharmacy flagyl
alprazolam no prescription
cheapest bactrim
buy cialis online
clomid sale
flagyl online stores
tramadol pills
propecia online cheap
lowest price tramadol
cheap valium tablets
price of viagra
clomid no prescription
synthroid pills
order doxycycline
nexium sale
order cialis
price of zithromax
buy nexium cheap
alprazolam for sale
discount valium
buy generic acomplia
generic tramadol
plavix without a prescription
online clomid
cheapest lorazepam prices
lasix without a prescription
order levitra online
cheap cialis online
online soma
cialis no prescription
buy propecia
zoloft discount
lowest price lasix
cheap prozac
phentermine generic
cheapest levitra
levitra pharmacy
clomid pharmacy
bactrim prices
acomplia online cheap
where to buy diazepam
cheap generic levitra
accutane sale
tramadol discount
cheapest doxycycline
purchase acomplia online
accutane online cheap
cheap generic tramadol
price of bactrim
order lorazepam online
order xanax online
purchase levitra
flagyl online
valium for sale
cialis
plavix sale
cheap levitra tablets
price of zoloft
purchase viagra online
cheap generic zoloft
flagyl discount
prozac prescription
soma pharmacy
propecia
order propecia online
price of flagyl
online levitra
price of doxycycline
bactrim
propecia without a prescription
acomplia prescription
order synthroid
zoloft online cheap
flagyl sale
buy synthroid cheap
buy lasix without prescription
zoloft without a prescription
alprazolam sale
buy tramadol without prescription
prozac without a prescription
flagyl generic
buy propecia online
cialis prices
purchase lasix
cheapest nexium
purchase diazepam
buy lorazepam without prescription
buy cialis cheap
lorazepam no prescription
where to buy accutane
xanax online
zithromax discount
prozac discount
synthroid prescription
lowest price bactrim
discount zithromax
accutane generic
buy generic bactrim
order valium online
buy generic lorazepam
cheap generic flagyl
where to buy zoloft
purchase accutane online
discount phentermine
plavix cheap
zithromax cheap
cheap generic lorazepam
viagra
cheap xanax online
purchase bactrim online
generic valium
propecia online stores
flagyl pharmacy
lowest price valium
buy synthroid without prescription
cheap viagra online
buy cheap lasix
cheap doxycycline tablets
levitra cheap
online alprazolam
diazepam pharmacy
cheapest nexium prices
purchase acomplia
xanax pharmacy
propecia pharmacy
cheap accutane online
valium without prescription
cheap alprazolam
purchase propecia
purchase diazepam online
cheapest phentermine prices
generic zoloft
order tramadol
clomid online stores
plavix no prescription
price of synthroid
cheap generic propecia
cheapest tramadol
order alprazolam online
buy alprazolam without prescription
buy cheap cialis
discount levitra
where to buy valium
cheap prozac online
cheap generic soma
lorazepam generic
buy flagyl cheap
price of propecia
lowest price soma
order acomplia online
lowest price viagra
buy doxycycline without prescription
cheap zithromax tablets
flagyl no prescription
diazepam without a prescription
cheap levitra online
prozac online cheap
levitra without a prescription
buy generic doxycycline
buy prozac cheap
phentermine for sale
buy bactrim cheap
pharmacy zithromax
cheapest flagyl
where to buy flagyl
acomplia online stores
buy lasix cheap
buy cheap propecia online
cheap soma
cheapest accutane prices
pharmacy alprazolam
lasix pharmacy
cheap zithromax
viagra prescription
zithromax without a prescription
online accutane
cheap lasix online
acomplia generic
cheap flagyl
cheap clomid tablets
order lasix online
cheapest alprazolam prices
buy nexium
buy cheap clomid
synthroid without a prescription
accutane pills
buy clomid
diazepam sale
bactrim sale
lorazepam
cheap doxycycline online
valium pills
buy soma cheap
buy lasix
phentermine online stores
buy synthroid online
online lorazepam
lasix no prescription
buy generic propecia
xanax for sale
cheapest zoloft prices
buy phentermine cheap
plavix online
cheap bactrim
cheap viagra tablets
viagra without prescription
cheap generic diazepam
buy zoloft cheap
order accutane online
cheapest soma prices
clomid cheap
viagra prices
phentermine cheap
nexium pharmacy
discount synthroid
lorazepam prices
buy xanax
flagyl cheap
cheap generic doxycycline
buy cheap levitra
prozac no prescription
buy zithromax cheap
discount lasix
discount tramadol
prozac without prescription
discount cialis
cheap lasix
soma prices
online phentermine
buy propecia without prescription
cheap diazepam online
online diazepam
plavix online cheap
order bactrim
where to buy soma
cheapest xanax prices
buy cheap xanax
xanax prices
cheap clomid online
prozac online
lowest price zithromax
online bactrim
cheapest cialis
valium online stores
synthroid online stores
zoloft prices
generic acomplia
xanax cheap
diazepam discount
viagra online
purchase tramadol online
valium without a prescription
order zithromax online
doxycycline no prescription
tramadol
clomid for sale
pharmacy soma
viagra discount
synthroid online cheap
purchase propecia online
viagra online cheap
cheap valium
cialis without a prescription
discount prozac
lasix online
levitra online cheap
cheap soma online
buy levitra without prescription
buy flagyl online
buy cheap zithromax online
acomplia discount
where to buy plavix
cheapest soma
soma online cheap
nexium without a prescription
purchase alprazolam
zoloft online
tramadol no prescription
cheap phentermine
online cialis
zoloft online stores
phentermine online
lasix pills
valium sale
cheap bactrim online
clomid prescription
generic viagra
levitra pills
purchase xanax online
buy bactrim
pharmacy plavix
buy cheap diazepam
accutane prescription
buy cheap diazepam online
buy nexium online
cheap lorazepam tablets
cheap alprazolam tablets
price of valium
buy cheap synthroid online
discount bactrim
lasix without prescription
generic alprazolam
flagyl without prescription
online xanax
viagra no prescription
generic zithromax
levitra prices
generic cialis
buy cheap phentermine online
buy clomid cheap
buy xanax cheap
cialis online
buy generic viagra
doxycycline discount
order clomid
online propecia
cheap plavix online
purchase valium online
cheap zoloft
generic propecia
lorazepam discount
buy cheap soma online
buy cheap prozac
phentermine prices
xanax pills
online prozac
prozac online stores
acomplia pharmacy
acomplia prices
buy viagra
lowest price doxycycline
cheap acomplia online
cheapest levitra prices
buy cheap doxycycline
buy cheap tramadol online
propecia prescription
zithromax generic
buy tramadol
price of plavix
lowest price phentermine
prozac sale
buy alprazolam
cheap generic clomid
cheapest accutane
discount soma
purchase synthroid online
buy generic plavix
doxycycline generic
purchase plavix
xanax prescription
valium generic
bactrim online cheap
purchase lorazepam online
buy xanax online
alprazolam online stores
price of acomplia
zoloft prescription
soma pills
generic levitra
cheap synthroid
discount zoloft
alprazolam pharmacy
viagra cheap
cheap accutane
cheap generic bactrim
buy phentermine online
buy flagyl
buy levitra
cheapest acomplia
buy generic phentermine
price of tramadol
buy cheap zithromax
cheap lasix tablets
buy plavix cheap
nexium discount
tramadol pharmacy
purchase accutane
phentermine online cheap
buy cheap acomplia online
cialis cheap
lasix for sale
cheap flagyl online
nexium no prescription
cheapest lasix prices
pharmacy xanax
buy tramadol online
alprazolam without prescription
buy zithromax online
order nexium
viagra generic
buy generic valium
where to buy acomplia
acomplia without a prescription
buy cheap viagra
pharmacy levitra
order phentermine online
buy flagyl without prescription
buy accutane
buy cheap alprazolam
purchase zithromax online
lowest price prozac
lowest price accutane
doxycycline sale
bactrim without a prescription
alprazolam online cheap
cheap generic zithromax
pharmacy bactrim
levitra discount
cheapest plavix prices
buy cheap synthroid
purchase doxycycline online
buy cialis without prescription
generic bactrim
buy zoloft online
synthroid prices
propecia online
cheap acomplia tablets
buy cheap zoloft
doxycycline pharmacy
cheapest prozac
cheap viagra
cheap nexium online
price of diazepam
cheap generic plavix
cialis prescription
xanax online stores
soma prescription
plavix without prescription
soma for sale
lowest price zoloft
cheapest zithromax prices
cheapest zithromax
buy generic alprazolam
lorazepam for sale
alprazolam generic
cialis for sale
cheap tramadol online
cheapest cialis prices
synthroid online
order tramadol online
buy viagra without prescription
order viagra online
zithromax no prescription
order plavix online
flagyl pills
cheap cialis tablets
cheap clomid
diazepam generic
buy generic nexium
purchase alprazolam online
flagyl
propecia pills
viagra without a prescription
propecia for sale
cheap cialis
flagyl for sale
prozac cheap
diazepam without prescription
zoloft sale
order viagra
accutane discount
doxycycline for sale
valium prescription
lorazepam online
bactrim discount
cheapest valium
order zoloft
alprazolam cheap
zoloft generic
buy prozac without prescription
purchase phentermine
online lasix
online flagyl
cheapest propecia
lorazepam sale
order synthroid online
valium online cheap
purchase doxycycline
cialis discount
lowest price plavix
purchase xanax
zithromax prices
pharmacy propecia
buy prozac
doxycycline
cheap generic synthroid
purchase tramadol
pharmacy viagra
cheapest xanax
soma
cheap generic accutane
soma no prescription
order lasix
price of nexium
buy valium without prescription
buy cheap accutane
xanax generic
doxycycline without a prescription
buy cheap levitra online
synthroid no prescription
cheapest phentermine
valium online
buy generic levitra
cheapest doxycycline prices
prozac for sale
plavix online stores
purchase levitra online
lorazepam without a prescription
zithromax online stores
lasix prescription
buy cheap cialis online
buy valium online
pharmacy zoloft
pharmacy doxycycline
price of accutane
cheapest clomid prices
clomid without a prescription
valium cheap
acomplia sale
bactrim without prescription
zoloft pharmacy
levitra prescription
tramadol cheap
buy viagra cheap
cheapest zoloft
buy soma
cheap propecia online
flagyl online cheap
cheap generic alprazolam
cheapest lorazepam
buy diazepam
purchase soma
soma without a prescription
buy generic diazepam
buy cheap viagra online
cheap levitra
cheap generic valium
purchase zoloft
order prozac
plavix
zoloft no prescription
discount xanax
pharmacy valium
clomid discount
cheap accutane tablets
accutane without prescription
soma without prescription
soma cheap
propecia no prescription
propecia without prescription
zithromax prescription
pharmacy accutane
cheapest viagra
buy bactrim online
diazepam cheap
order acomplia
buy generic zoloft
order valium
cheap soma tablets
xanax sale
buy generic soma
viagra for sale
cheap zoloft tablets
lorazepam prescription
diazepam prescription
price of xanax
nexium without prescription
order diazepam online
discount flagyl
where to buy lasix
pharmacy synthroid
cheap nexium tablets
buy cheap valium
generic prozac
buy xanax without prescription
zithromax sale
cheapest lasix
bactrim pills
lasix
where to buy xanax
diazepam online
order xanax
doxycycline pills
purchase nexium
phentermine pharmacy
cialis pills
buy doxycycline online
buy soma without prescription
lowest price levitra
clomid
alprazolam discount
buy phentermine
buy generic lasix
buy acomplia without prescription
cheap bactrim tablets
discount lorazepam
zithromax online cheap
buy diazepam cheap
generic soma
order propecia
generic diazepam
order nexium online
tramadol online cheap
purchase plavix online
lasix discount
online viagra
alprazolam prices
phentermine discount
where to buy levitra
acomplia for sale
soma online stores
buy cheap bactrim
bactrim online
price of levitra
generic accutane
buy cheap accutane online
order cialis online
nexium for sale
where to buy nexium
price of lorazepam
buy propecia cheap
doxycycline online
levitra sale
cheap nexium
cheapest flagyl prices
cialis without prescription
buy nexium without prescription
discount accutane
where to buy viagra
zoloft pills
where to buy doxycycline
tramadol for sale
buy zoloft
tramadol generic
cialis sale
where to buy clomid
online zoloft
cheap synthroid online
buy accutane online
nexium prescription
purchase flagyl
flagyl prices
buy generic prozac
discount alprazolam
diazepam no prescription
buy cheap plavix
viagra pills
phentermine without a prescription
buy valium cheap
generic flagyl
cialis generic
online zithromax
cheap generic nexium
doxycycline without prescription
lasix cheap
online plavix
buy plavix without prescription
generic doxycycline
plavix prescription
buy acomplia cheap
diazepam
xanax no prescription
discount clomid
purchase valium
online acomplia
lowest price xanax
tramadol prescription
pharmacy acomplia
lowest price synthroid
order alprazolamAs I mentioned in my last post, I’ve made a pre-release of Cocoalogue available for the PMC bundle. Only one person took advantage of the offer, which was so surprising to me I had sent him a license for Clockwork because I didn’t realize what he actually purchased! So not only is he Cocoalogue user #1 for all time, he’s also the happy owner of a Clockwork license! (See what you all missed out on?)
A Simple Cocoalogue Overview
Cocoalogue is an interpreted computer programming system, oftentimes called a scripting system or dynamic language these days. While the system shares a great deal in common with the Smalltalk-80 system on which it was based, Cocoalogue’s current executable model is more like the one used for Perl, Python, Ruby, AppleTalk, any of the shell programs which have scripting support, etc. It also includes a Cocoa bridge to allow use of the Objective-C/Cocoa frameworks on Mac OS X, and extensions to the Smalltalk syntax to allow static typing, namespaces, and more.
There are four main components to Cocoalogue as it now exists: the language compiler, the virtual machine, and the run-time system. They are designed to function fairly independently, so modification of any component doesn’t adversely affect the others. They can also be replaced independently, so a language compiler for Ruby could be substituted, for example; or the run-time system can be replaced with one written for Apple’s Open Scripting Architecture. Also, they are generally written in C using POSIX libraries for portability, although some functionality was implemented in Objective-C/Cocoa for expediency’s sake.
What is this Smalltalk of Which You Speak?
Since I’m pimping Smalltalk so often, I should explain a little bit about it so you understand some basic Cocoalogue concepts. Smalltalk is a programming environment developed at Xerox’ Palo Alto Research Center (PARC), incorporating programming language, tools and user interface, that was originally designed for educational purposes in the hope that the researchers developing it would discover how to make computers easier to use. Windowing Graphical User Interfaces (GUI) such as used by all implementations of the Mac OS and Windows, and Integrated Development Environments (IDE) used by Xcode and Visual Studio are based on inventions arising out of the Smalltalk initiative.
Wikipedia has a more detailed explanation of the history and implementation of Smalltalk than I have space for here. But I’ll briefly cover its syntax to explain what Cocoalogue has. Resources, or objects, used by programs are represented as variables in the Smalltalk language, and are sent messages that represent the actions the programmer wishes the objects to perform.
rectanglesContainingX: xCoordinate andY: yCoordinate
| rectangles aPoint|
rectangles := OrderedCollection
with: (Rectangle left: 0 right: 10 top: 100 bottom: 200)
with: (Rectangle left: 10 right: 10 top: 110 bottom: 210).
aPoint := Point x: xCoordinate y: yCoordinate.
^ rectangles select: [:aRect | aRect containsPoint: aPoint].
The example is for demonstrating Smalltalk syntax, not coding quality; so don’t use it as a template for your own work.
It defines a method named #rectanglesContainingX:andY: that returns an OrderedCollection, or list, of rectangles which contain a specific point given as an x-y coordinate, and represented in the example by xCoordinate and yCoordinate, respectively. The method defines two temporary variables, rectangles and aPoint, which are used to hold values computed for use while the method executes. The method creates an OrderedCollection object with two rectangles for elements (technically, it sends the message #left:right:top:bottom: to the Rectangle class two different times which has the responsibility to create the two rectangles, and those rectangles are then sent to the OrderedCollection class as part of the #with:with: message) and assigns the result to the rectangles temporary variable. It then creates a point for the given x-y coordinate (again technically, it sends #x:y: to the Point class along with the x-y coordinate). The last statement sends #select: to the OrderedCollection object represented by the rectangles variable, which has the responsibility of going through each rectangle element in the collection and finding every one which meets some criteria, passing the criteria test in an executable sequence of code as an object called a block. The collection’s #select: method returns a new collection which contains all the elements matching the test “contains aPoint“. The #rectanglesContainingX:andY: method then returns that result to whatever object called it.
Cocoalogue Isn’t Smalltalk
As much as I love Smalltalk, and have made having a professional-grade programming environment based on Smalltalk my goal, strict adherence to Smalltalk isn’t my objective for Cocoalogue. My objective is to create a development and work environment based on the interactive model I enjoyed using systems such as Squeak, BASIC, and Instant-C; which incorporate modern code development and management tools such as SCM; and use of legible programming languages such as Smalltalk. I’ll spell out the major deviations from Smalltalk systems as I outline the components below.
The Cocoalogue Run-Time System
The run-time system is itself composed of four parts: the memory management system, which uses an indirect pointer similar to relocatable blocks on the classic/Carbon Mac API combined with reference counting; the data types system, which permits the definition of types and their operators; the class library, which provides the pre-defined types and classes used to write programs; and the Cocoa bridge (it’s odd that there are Wikipedia entries for PyObjC, CamelBones, RubyCocoa, but none for Cocoa bridge) which allows interaction with objects created or used by Mac OS X’s Cocoa frameworks. Soon, the Cocoa bridge will also allow the declaration and invocation of normal C functions, but the syntax to do this hasn’t been finalized yet.
Cocoalogue’s Run-time Differences with Smalltalk
The largest distinguishable differences the current implementation of Cocoalogue has with Smalltalk are
- lack of a persistent image;
Although it would be relatively trivial to provide an image-based environment typical to Smalltalk implementations, I’ve forgone support in Cocoalogue’s current implementation to speed up development of other features. In addition, as the supported classes and functionality undergoes enhancement it’ll be best not to keep an image around which will undergo repeated changes to its fundamental objects.
- fine-grained control over the execution environment;
To support the ability to define types of arbitrary width (such as Smalltalk’s LargeInteger and Fraction) a type must be able to specify how, and whether, exceptional conditions should be handled by the run-time system. For the LargeInteger class, calculations which result in either over- or under-flow conditions should cause the class to widen the resulting object to fully contain the result whereas for types having an Int32 specification should discard the excess result bits, yet still permit the method or object which invoked the operation to know or respond to the exception itself.
- Cocoa classes instead of Smalltalk’s;
Smalltalk-compatible classes aren’t developed yet, so programming still requires familiarity with the Cocoa frameworks. Literals are instantiated from the corresponding Cocoa classes (NSNumber, NSString, etc.).
- DataType vs Object as fundamental type primitive;
To support primitive types for languages such as C, all types are derived from DataType in Cocoalogue’s language by specifying their widths in Bits, a concrete subclass of DataType. Operators are declared and invoked via the standard Smalltalk syntax so the functionality is inherited by Objects.
DataStructure is an abstract type derived from DataType and which defines aggregate structures whose members’ alignment and packing can be specified by the programmer, or the environment by default.
DataShared is an abstract type derived from DataStructure which defines structures whose members share the same offset from one end of the structure so their members “overlap” in storage.
Object is a concrete type derived from DataStructure which acts as the base type for all data types of the standard OOP model, and can contain either objects or DataTypes.
- Classes don’t need a Metaclasses support object;
Rather than maintain Smalltalk’s legacy of Class/Metaclass structure for inheritance, class methods, class variables, etc., I’ve shifted the classical class-based model into the DataType/DataStructure/Object/Class framework. This will allow the addition of other execution architectures into the run-time system.
Cocoalogue’s Virtual Machine
The virtual machine is a hybrid of abstract syntax tree and bytecode techniques to keep semantic info sufficiently close to executable code for debugging purposes and to give me enough leeway to optimize along any of several directions. They’re stored in sequences as literals along with standard data type literals, and are nestable and suitable for parameter passing to allow the declaration of the expected Smalltalk blocks (closures) as well as other sophisticated techniques for specifying code order and execution.
Cocoalogue’s Compiler
The compiler handles an extended version of the Smalltalk grammar that allows the specification of explicit types, bit widths, and byte-ordering for data. I sought to maintain strict conformity with Smalltalk syntax as much as possible, except perhaps for a place or two where I thought the syntax was inelegant. The additions to the syntax I made are generally in keeping with the beauty I found in the syntax, although admittedly with my own biases.
Cocoalogue’s Compiler Syntax Differences with Smalltalk’s
One of the basic questions for an explicit-typing extension to Smalltalk is, what does it look like? For Cocoalogue, one of the ways types can be specified is like this:
variableDeclaration = variableName ‘::’ className { inflection }.
wherever a variable is declared for use as a parameter, temporary, instance var, etc. inflection can be a type modifier such as ’signed’ or ‘unsigned’, an array specifier [delimited by '(' and ')'], or a pointer specifier (’^').
Smalltalk methods always pass a result back as an object, even when a result isn’t specified through the return (’^') expression when the result is the object currently executing the method in question. Thus Smalltalk methods have no syntax to specify the result. So Cocoalogue also has an extension to allow the type of the result to be specified. The default type for the result is Object. Otherwise, the result’s type is specified by appending “::^ className { inflection }” to the method’s message pattern. The Smalltalk example code given above might now look like the following in Cocoalogue:
rectanglesContainingX: xCoordinate::CGFloat andY: yCoordinate::CGFloat ::^ NSArray^
| rectangles :: NSArray^.
aPoint :: NSPoint.
each :: NSRect.
enumerator :: NSEnumerator^.
selectedRectangles :: NSMutableArray^. |
rectangles := #( (NSRect x: 0 y: 100 w: (10 - 0) h: (200 - 100))
(NSRect x: 10 y: 110 w: (10 - 10) h: (210 - 110) ).
aPoint := NSPoint x: xCoordinate y: yCoordinate.
enumerator := rectangles objectEnumerator.
selectedRectangles := NSMutableArray alloc init.
[(each := enumerator nextObject) != nil]
whileTrue:
[[eachRectangle containsPoint: aPoint]
ifTrue:
[selectedRectangles := addObject: eachRectangle]]].
^selectedRectangles
In accordance with the Cocoa frameworks, view coordinates are expressed from a normal Cartesian (bottom-left) orientation. As you can tell, the bulk of the code is to make up for the lack of support in Objective-C for closures which results in it being unsupported in Cocoa. When Smalltalk-like collection classes are added to Cocoalogue, the bulk of this example will be significantly reduced.
That’s a little overview of Cocoalogue as I promised in my last post. Once Mori 1.7 is released I’ll be able to continue completing basic Cocoalogue functionality. The main purpose of releasing it in scripting model form is to get it released and into use quickly. “Enhancements” (read greater Smalltalk class support) and surely bugfixes will follow.