So-o defines a functional layer which adds an object-oriented programming model to a structured programming language. Inspired by Smalltalk, So-o is complete, simple and light, easy to understand.
So-o proposes a standard implementation in several languages.
The code in PHP is less than a 1000 lines.
The code in C in just about 1500 lines.
The code in JavaScript is not even 700 lines.

Example
namespace Hello;
require_once 'So-o.php';
defclass('Hello', null, 1, null, null, null, array('hello'));
function i_hello($self) {
echo 'Hello from So-o!', PHP_EOL;
return $self;
}
Defines the class Hello which inherits from the default class Object. Its revision number is 1. It adds no class or instance properties. It adds no class methods. It adds an instance method called hello.
The function i_hello
defined in the Hello namespace implements the instance method called hello. $self
is the instance which has received the hello message.
$ php -a
php > require_once 'Hello.php';
php > $hello=sendmsg($Hello, 'new');
php > sendmsg($hello, 'hello');
Hello from So-o!
Loads the code for the Hello class. Sends the message new to the Hello class. The new method is implemented by the Object class. It returns a new instance of the class. Sends the message hello to the $hello
instance.

Example
#include "So-o.h"
class Hello;
static instance i_hello(instance self) {
printf( "Hello from So-o!\n" );
return self;
}
void defclassHello() {
selector _i_messages[] = {
"hello", METHOD(i_hello),
0, 0
};
Hello = defclass("Hello", 0, 1, 0, 0, 0, _i_messages);
}
A simple main to illustrate how the Hello class is used:
#include "So-o.h"
#include <stdlib.h>
extern class Hello;
extern void defclassHello();
int main( int argc, char *argv[] ) {
instance hello;
defclassHello();
hello = (instance)sendmsg(Hello, "new").p;
sendmsg(hello, "hello");
sendmsg(hello, "free");
exit( 0 );
}
Compilation with the library libso-o.a and execution:
$ gcc -O -c test-Hello.c
$ gcc -O -c Hello.c
$ gcc test-Hello.o Hello.o libso-o.a -o test-Hello
$ test-Hello
Hello from So-o!

Example
import { defclass } from 'So-o';
defclass('Hello', null, 1,
null,
null,
null,
{ 'hello': (self) => {
console.log('Hello from So-o!');
return self;
}
}
);
A few lines of code to illustrate how the Hello class is used:
import { sendmsg } from 'So-o';
import 'Hello';
var hello = sendmsg(Hello, 'new');
sendmsg(hello, 'hello');
Execution with Node.js:
$ ln Hello.js node_modules/Hello.mjs
$ ln testHello.js testHello.mjs
$ nodejs --experimental-modules testHello
Hello from So-o!
Visit so-o.org.

Comments