рд╕реА рдореЗрдВ рд▓рд┐рдЦреЗ рд▓рд┐рдореНрдмреЛ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХрднреА-рдХрднреА рдУрдПрд╕ рдЗрдиреНрдлрд░реНрдиреЛ рдбреНрд░рд╛рдЗрд╡рд░ рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡реЗ рдУрдПрд╕ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдореЙрдбреНрдпреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрдорддреМрд░ рдкрд░ рдЗрдирдлрд░реНрдиреЛ рдореЗрдВ рд▓рд┐рдореНрдмреЛ рдореЗрдВ рдЧрд╛рдпрдм рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддреА рд╣реИ (рдореМрдЬреВрджрд╛ 3-рдкрд╛рд░реНрдЯреА рд╕реА / рд╕реА ++ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдореЗрдЬрдмрд╛рди-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рд┐рд╕рдХрд▓реНрд╕ рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП) рдпрд╛ рдЕрдзрд┐рдХрддрдо рд╕рдВрднрд╡ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдирд┐рдЪреЛрдбрд╝рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ (рдореЗрд░реА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЕрдВрддрд░) рдЬреЗрдЖрдИрдЯреА рдФрд░ рд╕реА рдХреЗ рд╕рд╛рде рд▓рд┐рдореНрдмреЛ рдХреЗ рдмреАрдЪ рдХреА рдЧрддрд┐ рд▓рдЧрднрдЧ 1.3-1.5 рдЧреБрдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)ред
рд╕рд╛рдордЧреНрд░реА
рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░реЗрдВ
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрдиреНрдлрд░реНрдиреЛ рдХреЗ рдкрд╛рд╕ рд╕реА рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рд▓реЛрдб рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕реАрдзреЗ рдУрдПрд╕ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред (рдпрд╣ рд╡рд┐рдХрд╛рд╕ рдХреЛ рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рдж рдЗрдиреНрдлрд░реНрдиреЛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЖрд╡рд╢реНрдпрдХ рдЖрдВрд╢рд┐рдХ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдореЗрдВ рд▓рдЧрднрдЧ 10 рд╕реЗрдХрдВрдб рд▓рдЧрддреЗ рд╣реИрдВред)
рдЕрдкрдиреЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
libinterp/mkfile
,
module/runt.m
,
emu/Linux/emu
рдФрд░
emu/Linux/emu-g
ред рдФрд░ рдЪреВрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдирдпрд╛ рдореЙрдбреНрдпреВрд▓ рд╕рдорд╛рди рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рд╕рдорд╛рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдирдЬрд╛рди рдХреНрд░рдо рдореЗрдВ рдХрдИ рдРрд╕реЗ рдореЙрдбреНрдпреВрд▓, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣ рд╕рдХрддрд╛ рд╣реИ, рдорд╛рдирдХ
patch
рдХрдорд╛рдВрдб рдЖрд╡рд╢реНрдпрдХ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рд╡рд╣ рдПрдХ рдпрд╛ рджреЛ рдореЙрдбреНрдпреВрд▓ рдЬреЛрдбрд╝реЗрдЧреА, рд▓реЗрдХрд┐рди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рдмрд╛рдж рд╕реЗ рдЙрд╕реЗ рд╕рдорд╕реНрдпрд╛ рд╣реЛрдЧреА рдЗрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕рдВрдкрд╛рджрди рдпреЛрдЧреНрдп рд╕реНрдерд╛рди рд╡рд╣ рджреЗрдЦрдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рд╕реЗ рдмрд╣реБрдд рдЕрдзрд┐рдХ рднрд┐рдиреНрди рд╣реЛрдиреЗ рд▓рдЧреЗрдЧрд╛ред
рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ
рдкрд░реНрд▓ рдкрд░ рдПрдХ
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рд╕реНрдХреЗрдЪ рдХрд┐рдпрд╛ - рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдпрд╣ рд▓рд╛рдЗрди рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ
my $MODNAME = 'CJSON';
рдФрд░ рд╡рд╣ рдУрдПрд╕ рдЗрдиреНрдлрд░реНрдиреЛ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдЖрдкрдХреЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдХреЗ рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдмрджрд▓рд╛рд╡ рдХрд░реЗрдЧрд╛ред рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдЕрддрд┐рд░рд┐рдХреНрдд C / C ++ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЗрдиреНрдлрд░реНрдиреЛ рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рддреЛ рдЗрд╕ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЖрдкрдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (C ++ рдкреБрд╕реНрддрдХрд╛рд▓рдп
re2 рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдВрд╢реЛрдзрди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг
Re2 рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ
-R
рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХреЗред
рдЗрд╕рд▓рд┐рдП, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ, рдЗрд╕реЗ
$INFERNO_ROOT
рдореЗрдВ
$INFERNO_ROOT
, рдЗрд╕рдХрд╛ рдирд╛рдо рдмрджрд▓рдХрд░
$INFERNO_ROOT
, рдореЙрдбреНрдпреВрд▓ рдирд╛рдо рдХреЛ рдЗрд╕рдореЗрдВ "рдЙрджрд╛рд╣рд░рдг" рдореЗрдВ рдмрджрд▓реЗрдВ, рдФрд░ рдЗрд╕реЗ рдЪрд▓рд╛рдПрдВред рдЕрдм (рдЧреИрд░-рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ) рдЙрджрд╛рд╣рд░рдг рдореЙрдбреНрдпреВрд▓ рдХрд░реНрдиреЗрд▓ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рдпрд╣ рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдЗрдиреНрдлрд░реНрдиреЛ рдХреЗ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рджреЛ рдлрд╝рд╛рдЗрд▓реЗрдВ рдмрдирд╛рдПрдБ:
module/example.m
Example: module { PATH: con "$Example"; };
libinterp/example.c
#include <lib9.h> #include <isa.h> #include <interp.h> #include "runt.h" #include "examplemod.h" void examplemodinit(void) { builtinmod("$Example", Examplemodtab, Examplemodlen); }
рдФрд░ рдУрдПрд╕ рдЗрдиреНрдлрд░реНрдиреЛ рдХрд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рд╢реБрд░реВ рдХрд░реЗрдВ:
$ (cd libinterp/; mk nuke) $ rm Linux/386/bin/emu
рдЕрдм рд╣рдо рд▓рд┐рдореНрдмреЛ рдореЗрдВ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд▓реЛрдб рдХрд░реЗрдЧрд╛, рдЬреЛ рдЕрдм рддрдХ рдХреБрдЫ рднреА рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рд╣реИ:
testexample.b
implement TestExample; include "sys.m"; include "draw.m"; include "example.m"; TestExample: module { init: fn(nil: ref Draw->Context, nil: list of string); }; init(nil: ref Draw->Context, nil: list of string) { sys := load Sys Sys->PATH; example := load Example Example->PATH; if(example == nil) sys->print("fail to load Example: %r\n"); else sys->print("Example module loaded\n"); }
рдФрд░ рдЪрд▓рд╛рдПрдВ:
$ emu ; limbo testexample.b ; testexample Example module loaded ;
рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
рдЕрд╕реЗрдВрдмрд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди,
module/example.m
рдлрд╝рд╛рдЗрд▓ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЖрд╡рд╢реНрдпрдХ C- рд╕рдВрд░рдЪрдирд╛рдПрдБ рдЙрддреНрдкрдиреНрди рдХреА рдЬрд╛рддреА рд╣реИрдВ рдЬреЛ рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреА рд╣реИрдВ - рдПрдХ рдЕрд▓рдЧ
libinterp/examplemod.h
- рдФрд░ рдЗрд╕рдХреЗ рд╕рдВрдкреВрд░реНрдг рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рд╕реНрдерд┐рд░рд╛рдВрдХ, adt-shki, рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЛ
libinterp/runt.h
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ)
libinterp/runt.h
рдЬрд┐рд╕рдореЗрдВ рд╕рднреА C- рдореЙрдбреНрдпреВрд▓ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╣реИред рдпреЗ рджреЛ .h рдлрд╛рдЗрд▓реЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдорд╛рд░реЗ
libinterp/example.c
рд╕реЗ рдЬреБрдбрд╝реА рд╣реИрдВред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, OS Inferno рдХреА рдмреВрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди, рдПрдХ рдмрд╛рд░
examplemodinit()
рдЬреЛ рд╣рдорд╛рд░реЗ рдореЙрдбреНрдпреВрд▓ (рдпрджрд┐ рдХреЛрдИ рд╣реЛ) рдХреЗ рд╡реИрд╢реНрд╡рд┐рдХ рдбреЗрдЯрд╛ рдХреЛ
examplemodinit()
рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕реЗ (Inferno рдХреЛрд░ рдореЗрдВ
builtinmod(тАж)
рдХрд╣рдХрд░) рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЛ
load
рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рд▓рд┐рдореНрдмреЛ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ
PATH
builtinmod()
рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣рдорд╛рд░реЗ
builtinmod()
рдФрд░
$ рдЙрджрд╛рд╣рд░рдг рдЫрджреНрдо-рдкрде рдХреЗ рдмреАрдЪ рд╕рдВрдмрдВрдз рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдХрд╛рд░реНрдп: рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдо рд╡рд╛рдкрд╕ рдХрд░рдирд╛
рд╕рдВрдЦреНрдпрд╛
рдЖрдЗрдП рд╕рд░рд▓ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ рддрд╛рдХрд┐ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЬрдЯрд┐рд▓ рди рдХрд░реЗрдВред
рдЗрдиреНрдлрд░реНрдиреЛ рдХрд╛ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВред
рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЪрд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ
emu
рдХреЛ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ, рдЬреИрд╕рд╛ рдХрд┐
рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЪрд▓ рд░рд╣реЗ
emu
рдореЗрдВ рдПрдХ рд╕рдВрд╢реЛрдзрд┐рдд рд╕реА-рдореЙрдбреНрдпреВрд▓ рдирд╣реАрдВ рд╣реИред
$ emu ; limbo testexample.b ; testexample Example module loaded increment(5) = 6 ;
рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рджреМрд░рд╛рди,
module/example.m
рдореЗрдВ рдкрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ
increment()
рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╡рд┐рд╡рд░рдг, рдЗрд╕рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рд░рд┐рдЯрд░реНрди рдорд╛рди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдлрд╝рд╛рдЗрд▓
libinterp/runt.h
рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рдерд╛:
void Example_increment(void*); typedef struct F_Example_increment F_Example_increment; struct F_Example_increment { WORD regs[NREG-1]; WORD* ret; uchar temps[12]; WORD i; };
рдореБрдЭреЗ рдЕрднреА рддрдХ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓рд╛ рд╣реИ рдХрд┐
regs
рдХреНрдпрд╛
regs
; рд╕рдВрд░реЗрдЦрдг рдХреЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝реЗ рдЧрдП
temps
;
ret
рд░рд┐рдЯрд░реНрди рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХ рд╣реИ; рдФрд░
i
рд╣рдорд╛рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ
рдкрдВрдХреНрддрд┐рдпрд╛рдВ
module/example.m
Example: module { ... say: fn(s: string); };
libinterp/example.c
... void Example_say(void *fp) { F_Example_say *f; String *s; char *str; f = fp; s = f->s; str = string2c(s); print("%s\n", str); }
testexample.b
... init(nil: ref Draw->Context, nil: list of string) { ... example->say("Hello!"); }
рд╣рдо рдПрдХрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░рддреЗ рд╣реИрдВ, рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ:
$ emu ; limbo testexample.b ; testexample Example module loaded increment(5) = 6 Hello! ;
рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ
рдпрд╣рд╛рдБ рд╣рдореЗрдВ
libinterp/runt.h
рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ:
void Example_say(void*); typedef struct F_Example_say F_Example_say; struct F_Example_say { WORD regs[NREG-1]; WORD noret; uchar temps[12]; String* s; };
noret
рд╕рд╛рде
noret
рдмрдЬрд╛рдп
ret
рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ,
say()
рдлрд╝рдВрдХреНрд╢рди рдХреБрдЫ рднреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред
String*
рдкреНрд░рдХрд╛рд░ рд▓рд┐рдореНрдмреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХрд╛ C рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рдЖрдк
include/interp.h
struct String
рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ (рдЬреИрд╕реЗ
string2c()
рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП
string2c()
рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп
libinterp/string.c
ред
рдЕрдиреНрдп рд▓рд┐рдореНрдмреЛ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдПрдХ рд╕рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
Array*
,
List*
, рдЖрджрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗред рд╕рднреА рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк
libinterp/xec.c
рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдЙрджрд╛рд╣рд░рдг рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдВ)ред
module/example.m
рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд╕реНрдЯрдо adt рдХреЛ рдирд┐рдпрдорд┐рдд C- рд╢рд░реНрдореАрд▓реА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдмрджрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ (рдФрд░ adt рдХреЛ рдпреВрдирд┐рдпрди рдореЗрдВ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдЯреБрдкрд▓реНрд╕ рдХреЛ рднреА рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рд╕рдВрд░рдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ,
module/example.m
рдмрджрд▓рддреЗ рд╕рдордп рдХреЗ рдмрд╛рдж
module/example.m
рдЖрдкрдХреЛ
libinterp/runt.h
рдХреЛ
libinterp/runt.h
рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд╕реЗрдВрдмрд▓реА (рдЬреЛ рдХрд┐ рдЧрд▓рддреА рд╕реЗ рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧреА) рдХреЛ рд╢реБрд░реВ
libinterp/runt.h
рд╣реЛрдЧрд╛ рдФрд░ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЖрдкрдХреЗ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реЗ рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдмрдирд╛рдП рдЧрдП рд╣реИрдВ рдФрд░ рдпрд╣ рд╕рдордЭреЗрдВ рдХрд┐
libinterp/example.c
рдореЗрдВ рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ ред
рдЕрдкрд╡рд╛рдж
рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕
error()
рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВред рдЖрдк
libinterp/raise.c
рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдорд╛рдирдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдпрд╛ рдЙрд╕реА рддрд░рд╣ рд╕реЗ
libinterp/example.c
рдореЗрдВ рдЕрдкрдиреА рдЦреБрдж рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдиреЗ рдХреЗ
raise.h
рдХреЛ
raise.h
рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдмреЗрд╢рдХ, рдЕрдЧрд░ рдЖрдкрдиреЗ рдЦреБрдж рдХреЛ
malloc()
рдорд╛рдзреНрдпрдо рд╕реЗ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХреА рд╣реИ, рддреЛ рдХреЙрд▓рд┐рдВрдЧ
error()
рд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ рдЗрд╕ рдореЗрдореЛрд░реА рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдПрдХ рд░рд┐рд╕рд╛рд╡ рд╣реЛрдЧрд╛ред рдвреЗрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдорд╛рдирдХ рддрд░реАрдХреЗ рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рд╡рд╕реНрддреБрдУрдВ (рдЬреИрд╕реЗ
String*
рдФрд░
Array*
) рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╡реИрд╕реЗ рднреА рд╡реЗ рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдкрд╛рдП рдЬрд╛рдПрдВрдЧреЗ рдФрд░ рд╣рдЯрд╛рдП рдЬрд╛рдПрдВрдЧреЗред (
рднрд╛рдЧ 2 рдореЗрдВ рдвреЗрд░ рдФрд░ рдХрдЪрд░рд╛ рд╕рдВрдЧреНрд░рд╣рдХрд░реНрддрд╛ рдХреЗ рдХрд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ)
рд╡рд╛рдкрд╕реА рд▓рд┐рдВрдХ
рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдкрд░рд┐рдгрд╛рдо рд▓реМрдЯрд╛рддреЗ рд╕рдордп рдПрдХ рдирд┐рд╣рд┐рдд рдХреНрд╖рдг рдЗрд╕ рддрдереНрдп рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ рдХрд┐
*f->ret
рдореЗрдореЛрд░реА рд╕реЗрд▓ рдореЗрдВ рднреМрддрд┐рдХ рд░реВрдк рд╕реЗ
*f->ret
рдкреЙрдЗрдВрдЯреНрд╕ рдЬрд╣рд╛рдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЙрд╕рдХреЗ рд╕рдлрд▓ рд╕рдорд╛рдкрди рдХреЗ рдмрд╛рдж рд╕реНрдерд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд╕реЗ рджреЛ рдкрд░рд┐рдгрд╛рдо рд╕рд╛рдордиреЗ рдЖрддреЗ рд╣реИрдВ:
- рдпрджрд┐ рдЖрдк рдкрд╣рд▓реА рдмрд╛рд░ рдкрд░рд┐рдгрд╛рдо рдХреЛ
*f->ret
рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реБрдИ рд╣реИ рдФрд░ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджреЗрдВ, рддреЛ рдХреБрдЫ рдЕрд╕рдВрднрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рд▓рд┐рдореНрдмреЛ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ: рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдорд╛рди рд╡рд╛рдкрд╕ рдХрд░реЗрдЧрд╛ рдФрд░ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХ рджреЗрдЧрд╛ред - рдпрджрд┐ рд╡рд╣ рдЪрд░ рдЬрд╣рд╛рдВ рдЖрдкрдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИ, рдореЗрдВ рдХреБрдЫ рдореВрд▓реНрдп рд╣реЛрддрд╛ рд╣реИ (рдЬреЛ рдХрд┐ рдПрдХ рд╕рдВрджрд░реНрдн рднреА рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдЪрд░ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдЖрдкрдХреЗ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рджрд┐рдП рдЧрдП рдорд╛рди рдХреЗ рд╕рдорд╛рди рд╣реИ), рддреЛ рдЖрдкрдХреЛ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдореЗрдореЛрд░реА рд╕реЗ рдореБрдХреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЖрдкрдХреЗ рд╕рд╛рде рдЗрд╕ рд▓рд┐рдВрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХреИрд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реИред
рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдЕрдкрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВ
increment()
рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
libinterp/example.c
... void Example_increment(void *fp) { ... *f->ret = i + 1; error("some error"); }
testexample.b
... init(nil: ref Draw->Context, nil: list of string) { ... i := 0; { i = example->increment(5); } exception e { "*" => sys->print("catched: %s\n", e); } sys->print("i = %d\n", i); }
; testexample ... catched: some error i = 6 ;
рд╕реА-рдлрд╝рдВрдХреНрд╢рдВрд╕ рдореЗрдВ рджреВрд╕рд░реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд░рд┐рдЯрд░реНрди рд╡реИрд▓реНрдпреВ рдХреЛ
*f->ret
рд╕реЗ рдмрдЪрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ
*f->ret
рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдп рдХреЛ рдореБрдХреНрдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
destroy(*f->ret); *f->ret = new_value;
рдпрд╛ рддреЛ (
H
рд▓рд┐рдореНрдмреЛ-рдирд┐рд▓реНрд╕
nil
рдХрд╛ рд╕реА-рд╡реЗрдВ рдПрдирд╛рд▓реЙрдЧ рд╣реИ):
void *tmp; ... tmp = *f->ret; *f->ret = H; destroy(tmp); ... *f->ret = new_value;
рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдлрд┐рд▓рд╣рд╛рд▓ рдЗрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдбрд┐рд╕реНрдХ рдХреЛ рдХрдИ рд╕реАрдкреАрдпреВ / рдХреЛрд░ рдкрд░ рдПрдХ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╡рд╛рд▓рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред
рдбрд┐рд╕реНрдХ рдмреНрд▓реЙрдХ
рдЗрдиреНрдлрд░реНрдиреЛ рдЧреНрд▓реЛрдмрд▓ рдбрд┐рд╕ рд▓реЙрдХ (рд╢рд╛рдпрдж рдЕрдЬрдЧрд░ рдореЗрдВ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЬреНрдЮрд╛рдд рдЬреАрдЖрдИрдПрд▓ рдХреЗ рд╕рдорд╛рди) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред C-shnyh рдлрд╝рдВрдХреНрд╢рди рд▓реЙрдХ рд╕реЗрдЯ рдХреЗ рд╕рд╛рде рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдбрд┐рд╕ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИ (рдпрд╛рдиреА, рд▓рд┐рдВрдмреЛ рд╕реЗ рд╕реБрд▓рдн рдХреЛрдИ рднреА рдорд╛рди рдФрд░ рдЪрд░ - рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рд╕реА-рдлрд╝рдВрдХреНрд╢рдВрд╕ рдХреЗ рд░рд┐рдЯрд░реНрди рдорд╛рди рд╕рд╣рд┐рдд) рдХреЗрд╡рд▓ рдПрдХ рд╕реЗрдЯ рд▓реЙрдХ рдХреЗ рд╕рд╛рдеред
рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреБрдЫ рд▓рдВрдмрд╛ рдСрдкрд░реЗрд╢рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрдврд╝рдирд╛ / рд▓рд┐рдЦрдирд╛ рдпрд╛ рдХрд┐рд╕реА рдмрд╛рд╣рд░реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ "рднрд╛рд░реА" рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдпрд╛ рдХреБрдЫ рд▓рдВрдмреА рдЧрдгрдирд╛ рдХрд░рдирд╛), рддреЛ рдЖрдкрдХреЛ рдЗрд╕ рдСрдкрд░реЗрд╢рди рд╕реЗ рдкрд╣рд▓реЗ
release()
рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдбрд┐рд╕реНрдХ рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдереНрд░реЗрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдЕрдкрдиреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ, рдФрд░ рдлрд┐рд░
acquire()
рдлрд┐рд░ рд╕реЗ рдбрд╛рд▓реЗрдВ (рдЕрдиреНрдпрдерд╛, рдкрд░рд┐рдгрд╛рдо рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдФрд░ рд▓рд┐рдВрдмреЛ рдХреЛрдб рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯрдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬреЛ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╣рддреЗ рд╣реИрдВ)ред рдПрдХ рдЙрджрд╛рд╣рд░рдг
sys->read()
emu/port/inferno.c
рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
void Sys_read(void *fp) { ... release(); *f->ret = kread(fdchk(f->fd), f->buf->data, n); acquire(); }
рднрд╛рдЧ реи