X-Git-Url: http://nitlanguage.org diff --git a/examples/extern_methods.nit b/examples/extern_methods.nit index c080348..333540b 100644 --- a/examples/extern_methods.nit +++ b/examples/extern_methods.nit @@ -1,6 +1,6 @@ # This file is part of NIT ( http://www.nitlanguage.org ). # -# Copyright 2012 Alexis Laferrière +# Copyright 2012-2013 Alexis Laferrière # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -14,36 +14,45 @@ # See the License for the specific language governing permissions and # limitations under the License. -# This module illustrates some uses of the native interface, specifically +# This module illustrates some uses of the FFI, specifically # how to use extern methods. Which means to implement a Nit method in C. -# -# Steps to use extern methods: -# 1. Write the Nit module (like this file), define extern methods -# with "is extern" and identify possible callbacks with "import". -# 2. Run ithe "nits" program on the Nit module, it will generate -# two files, extern_methods.stub.[ch] files. -# 3. Modify those files to implement Nit methods in C. -# 4. Rename the stub files to extern_methods.nit.c and extern_methods.nit.h. module extern_methods redef enum Int # Returns self'th fibonnaci number # implemented here in C for optimization purposes - fun fib : Int is extern + fun fib: Int import fib `{ + if (self < 2) + return self; + else + return Int_fib(self-1) + Int_fib(self-2); + `} # System call to sleep for "self" seconds - fun sleep is extern + fun sleep `{ + sleep(self); + `} - # Return atan2l( self, x ) from libmath - fun atan_with( x : Int ) : Float is extern + # Return atan2l(self, x) from libmath + fun atan_with(x: Int): Float `{ + return atan2(self, x); + `} # This method callback to Nit methods from C code # It will use from C code: # * the local fib method # * the + operator, a method of Int # * to_s, a method of all objects - # * String::to_cstring, a method of String to return an equivalent char* - fun foo is extern import fib, +, to_s, String::to_cstring + # * String.to_cstring, a method of String to return an equivalent char* + fun foo import fib, +, to_s, String.to_cstring `{ + long self_fib = Int_fib(self); + long self_plus_fib = Int__plus(self, self_fib); + + String nit_string = Int_to_s(self_plus_fib); + char *c_string = String_to_cstring(nit_string); + + printf("from C: self + fib(self) = %s\n", c_string); + `} # Equivalent to foo but written in pure Nit fun bar do print "from Nit: self + fib(self) = {self+self.fib}" @@ -54,7 +63,7 @@ print 12.fib print "sleeping 1 second..." 1.sleep -print 100.atan_with( 200 ) +print 100.atan_with(200) 8.foo 8.bar