Introduction
So-o définit une couche fonctionnelle qui ajoute un modèle de programmation orientée objet à un langage de programmation structurée. Inspiré par Smalltalk, fruit d'un longue pratique d'Objective C et de différents dialectes du Lisp, So-o est complet, simple et léger, facile à comprendre.
Implémentation
So-o a 3 fonctions : defclass
qui définit une nouvelle classe, sendmsg
qui sert systématiquement à envoyer un message à une classe ou à une instance, et supersend
qui exécute une méthode héritée d'une superclasse. Simply object-oriented !
So-o propose une implémentation type en plusieurs langages. Le code en PHP a moins de 1000 lignes. Le code en C tient en quelque 1500 lignes. Le code en JavaScript fait à peine 700 lignes.
Exemple
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;
}
Définit la classe Hello qui a un message d'instance : hello. La fonction i_hello
implémente la méthode.
$ php -a
php > require_once 'Hello.php';
php > $hello=sendmsg($Hello, 'new');
php > sendmsg($hello, 'hello');
Hello from So-o!
Une partie de poker • Un programme complet écrit en PHP avec So-o.
Exemple
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);
}
Un simple main
pour illustrer l'utilisation de la classe Hello
:
#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 );
}
$ gcc -O -fstrength-reduce -finline-functions -fomit-frame-pointer -c test-Hello.c
$ gcc -O -fstrength-reduce -finline-functions -fomit-frame-pointer -c Hello.c
$ gcc test-Hello.o Hello.o libso-o.a -o test-Hello
$ test-Hello
Hello from So-o!
Une partie de poker • Un programme complet écrit en C avec So-o.
Exemple
defclass('Hello', null, 1,
null,
null,
null,
{ 'hello': (self) => {
console.log('Hello from So-o!');
return self;
}
}
);
Quelques lignes de code pour illustrer l'utilisation de la classe Hello
:
import 'Hello';
var hello = sendmsg(Hello, 'new');
sendmsg(hello, 'hello');
$ ln Hello.js node_modules/Hello.mjs
$ ln testHello.js testHello.mjs
$ nodejs --experimental-modules testHello
Hello from So-o!
Une partie de poker • Un programme complet écrit en JavaScript avec So-o.