Syntax differences
Strings in Smalltalk MT are delimited by single quote e.g. 'Here is a
string'. To embed a quote in a string, double it e.g. 'It''s here'.
Comments in Smalltalk MT use double quotes e.g. "Here is a comment". Or you
can use /* and */ as in C.
Statements in Smalltalk MT end with a period.
Variables are not typed in Smalltalk MT. All variables hold an Object which
knows it's type. Use | to declare variables. For example in a Workspace type
|var1|
var1 := Array new: 30. "This declares an Object of type Array and stores it
in var1"
var1 class. "If you do a Display here, it will show Array. var1 knows its type"
In Smalltalk comma is used for concatenation. For example: 'abc','def' will
concatenate two strings. This same operator will concatenate any two objects if
they have the appropriate behaviour (e.g. two arrays).
Operator differences
Here is a table of some of the operator differences.
Operator |
Name or Meaning |
Associativity |
Smalltalk MT |
:: |
Scope resolution |
None |
Same |
:: |
Global |
None |
|
[ ] |
Array subscript |
Left to right |
send the message at: |
( ) |
Function call |
Left to right |
No function calls |
( ) |
Conversion |
None |
|
. |
Member selection (object) |
Left to right |
|
–> |
Member selection (pointer) |
Left to right |
|
++ |
Postfix increment |
None |
|
–– |
Postfix decrement |
None |
|
new |
Allocate object |
None |
|
delete |
Deallocate object |
None |
|
delete[ ] |
Deallocate object |
None |
|
++ |
Prefix increment |
None |
|
–– |
Prefix decrement |
None |
|
* |
Dereference |
None |
|
& |
Address-of |
None |
basicAddress |
+ |
Unary plus |
None |
No unary plus |
– |
Arithmetic negation (unary) |
None |
Both available |
! |
Logical NOT |
None |
not |
~ |
Bitwise complement |
None |
|
sizeof |
Size of object |
None |
sizeInBytes |
sizeof ( ) |
Size of type |
None |
sizeInBytes |
typeid( ) |
type name |
None |
class |
(type) |
Type cast (conversion) |
Right to left |
all casting is performed by sending messages e.g. asInteger,
asFloat, asString etc. |
const_cast |
Type cast (conversion) |
None |
See (type) above. |
dynamic_cast |
Type cast (conversion) |
None |
See (type) above. |
reinterpret_cast |
Type cast (conversion) |
None |
See (type) above. |
static_cast |
Type cast (conversion) |
None |
See (type) above. |
.* |
Apply pointer to class member (objects) |
Left to right |
|
–>* |
Dereference pointer to class member |
Left to right |
MemoryManager atAddress: aPointer. |
* |
Multiplication |
Left to right |
* |
/ |
Division |
Left to right |
/ returns a fraction, a float or an integer depending on the
arguments. // always returns an Integer |
% |
Remainder (modulus) |
Left to right |
\\ |
+ |
Addition |
Left to right |
+ |
– |
Subtraction |
Left to right |
- |
<< |
Left shift |
Left to right |
<< |
>> |
Right shift |
Left to right |
>> |
< |
Less than |
Left to right |
< |
> |
Greater than |
Left to right |
> |
<= |
Less than or equal to |
Left to right |
<= |
>= |
Greater than or equal to |
Left to right |
>= |
== |
Equality |
Left to right |
== means the same identical Object. = means that the Objects
compare the same. |
!= |
Inequality |
Left to right |
~= |
& |
Bitwise AND |
Left to right |
& |
^ |
Bitwise exclusive OR |
Left to right |
bitXor: anInteger |
| |
Bitwise OR |
Left to right |
| |
&& |
Logical AND |
Left to right |
&& |
|| |
Logical OR |
Left to right |
or: |
e1?e2:e3 |
Conditional |
Right to left |
e1 ifTrue: [e2] ifFalse: [e3] |
= |
Assignment |
Right to left |
:= |
*= |
Multiplication assignment |
Right to left |
a := a * b |
/= |
Division assignment |
Right to left |
a := a / b |
%= |
Modulus assignment |
Right to left |
a := a \\b |
+= |
Addition assignment |
Right to left |
a := a + b. |
– = |
Subtraction assignment |
Right to left |
a := a - b. |
<<= |
Left-shift assignment |
Right to left |
a := a << b. |
>>= |
Right-shift assignment |
Right to left |
a := a >> b. |
&= |
Bitwise AND assignment |
Right to left |
a := a & b. |
|= |
Bitwise inclusive OR assignment |
Right to left |
a := a | b. |
^= |
Bitwise exclusive OR assignment |
Right to left |
a := a xor: b. |
, |
Comma |
Left to right |
concatenate |
DLL differences
In C++, WINAPI calls are declared as extern and are bound in by the linker.
In Smalltalk MT, libraries are bound into the running development environment.
This has the advantage that API call can be executed in a workspace. To bind a
library, go to the Transcript and use Image Properties (2nd icon from the
right). Add your DLL. Check the list to make sure it was found. Now save your
image (last icon on the right). When you restart your image, the DLL has been
bound into your development environment. To try out an API call, open a
workspace and type
WINAPI MessageBeep: -1
This calls the MessageBeep API in Kernel DLL.
Debugging
The simplest debugging approach is to use DBMON. To write to DBMON, use
Process outputDebugLine: 'Here is a debugging message'.
To include the value of a variable use
Processor outputDebugLine: 'Variable var1 has value ',var1 printString.
|