Archive for November, 2014


t is our pleasure to bring you the current version of Cincom Smalltalk. Cincom continues to provide high value and low cost with a rapid return on investment at low risk, allowing you to win more business, operate efficiently and deliver as promised.

The current releases of ObjectStudio 8.6 and VisualWorks 8.0 are major releases and contain recent past improvements as well as new “millennial” changes that include revamped frameworks that were originally done before 2000, but are now being overhauled for big improvements in the products. These “millennial” changes include Text2, SourceCode Editor 2 and UISkinning (Look & Feel 2) for the Foundation tools as well as VisualWorks applications. ObjectStudio also has a “millennial” change in its next generation user interface.

  • See the ObjectStudio 8.6 major release feature changes here.
  • See the VisualWorks 8.0 major release feature changes here.

As before, you can request media or an ftp transfer of the product. For other options, please speak with your account manager. To request a new release, just go to this link on our website and fill out the form:

http://www.cincomsmalltalk.com/main/services-and-support/support/customer-product-request/

Advertisements

The Cincom Smalltalk product line, which includes Cincom® ObjectStudio® and Cincom® VisualWorks®, is constantly being updated and improved upon so that the products stay competitive and technologically advanced to attract and bring in new accounts, and to help our clients achieve their goals and simplify the complexity of their businesses.

To help keep up-to-date, we have several locations on the Cincom Smalltalk website where anyone can find out the latest product improvements, changes and release information.

These locations include:

Cincom Smalltalk

ObjectStudio

VisualWorks

We hope that you find these pages helpful in keeping up-to-date on the new improvements and innovations that take place with each new release.

A New Collection!

We have a new type of collection that’s available in both of our Cincom Smalltalk products— Cincom® ObjectStudio and Cincom® VisualWorks®.

The name of it is … (drum roll please) “Treap” …  What?!

I know, it doesn’t exactly roll off the tongue.

So what exactly is a “Treap”?

The name Treap is a contraction of the names “Tree” and “Heap” and is a type of balanced binary tree.  It is not new as a computer science data structure, but as a new addition to our products, you may want to know where and how it can be used effectively.

What is it, and how does it compare with more traditional Smalltalk collections?

Treap is more of a hybrid collection, which makes it very versatile and useful in the right context.

It has fast keyed lookup (like a dictionary).

It can use ordered access (like an Array or an OrderedCollection) with enumeration, but the objects are ordered or sorted based on the key.

It also allows bidirectional access to the ordered list.

Treap is structured as a balanced binary tree of nodes.  Each node holds the key and value objects and is linked as a bidirectional linked list.

In what circumstances might a Treap be useful?

If you are using a dictionary for lookup and also enumerate through the sorted keys of the dictionary, a Treap might be a better solution, since it already maintains a sorted order based on the keys.

Alternatively, if you are using a SortedCollection, but need faster random look-up speed, a Treap might just be the best choice.

Another use is if you have to find an object (quickly) and then access the objects just before or after it. In this scenario, you would look up the node and then get the prior or following node with #previous or #next respectively, to navigate the linked list forward and backward.

Are there any drawbacks?

Just like using any Collection or data structure, there are advantages and tradeoffs to using each one. For Treap, the main drawback is probably the space and overhead to have and maintain the nodes and their links.  My suggestion would be to consider using it only where you are getting the benefit of the order and look-up speed, and possibly navigation.

Finding Treap – Treap came into the products as a means for supporting the performance of Text2. You can use it as Text2.Treap for access.  In the future, Treap may move into the Collection hierarchy where you would expect to find it.

Performance – In some simple benchmarking, I find look-up speed using Treap comparable to a dictionary.  If you then have to enumerate through the elements based on the sorted dictionary keys, using a Treap is significantly faster, since it essentially skips the sort by already maintaining that order.

In the meantime, I have made some additions and tweaks for Treap that you may find useful and interesting. The methods add in some of the enumerators for a collection class (#do: #select: #collect: #keysDo:) that were either missing or could perform better. See the methods (for the instance side of Treap) below.

I look forward to any feedback, particularly if you have a good use for Treap in your applications!

Regards

Arden Thomas
Cincom Smalltalk Product Manager
athomas@cincom.com

do: aBlock
“Evaluate aBlock for each of the receiver’s values.”
| node |
node := self minimumNode.
[node isNil] whileFalse:[
aBlock value: node value.
node := node next].

keysDo: aBlock
“Evaluate aBlock for each of the receiver’s keys.
| node |
node := self minimumNode.
[node isNil] whileFalse:[
aBlock value: node key.
node := node next].

select: aBlock
“Evaluate aBlock with each of the receiver’s elements as the
argument.
Collect into a new collection like the receiver, only those
elements for which aBlock evaluates to true.  Answer the new
collection.”
| newCollection |
newCollection := self species new.
self keysAndValuesDo: [:key :value | (aBlock value: value)
ifTrue: [newCollection at:key put: value]].
^newCollection

collect: aBlock
“Evaluate aBlock with each of the values of the receiver as the
argument.  Collect the resulting values into a collection that
is like the receiver.  Answer the new collection.”
| newCollection |
newCollection := self species new.
self keysAndValuesDo: [:key :value | newCollection at:key put:
(aBlock value: value) ].
^newCollection