python: rename >factor to py>, rename import to py-import, minor stuff.
parent
5157d84a6b
commit
14f43d8cb8
|
@ -2,12 +2,10 @@ USING: alien alien.c-types alien.destructors alien.libraries alien.libraries.fin
|
|||
alien.syntax assocs kernel sequences system ;
|
||||
IN: python.ffi
|
||||
|
||||
<< "python" {
|
||||
{ linux { "3.0" "2.7" "2.6" } }
|
||||
{ windows { "30" "27" "26" } }
|
||||
} os of [
|
||||
"python" prepend find-library
|
||||
] map-find drop cdecl add-library >>
|
||||
<< "python" { "3.0" "2.7" "2.6" }
|
||||
os windows? [ [ [ CHAR: . = not ] filter ] map ] when
|
||||
[ "python" prepend find-library ] map-find drop
|
||||
cdecl add-library >>
|
||||
|
||||
! Functions that return borrowed references needs to be called like this:
|
||||
! Py_Func dup Py_IncRef &Py_DecRef
|
||||
|
|
|
@ -13,11 +13,11 @@ HELP: >py
|
|||
{ $examples
|
||||
{ $example
|
||||
"USING: python ;"
|
||||
"10 iota >array >py >factor ."
|
||||
"10 iota >array >py py> ."
|
||||
"{ 0 1 2 3 4 5 6 7 8 9 }"
|
||||
}
|
||||
}
|
||||
{ $see-also >factor } ;
|
||||
{ $see-also py> } ;
|
||||
|
||||
ARTICLE: "python" "Python binding"
|
||||
"The " { $vocab-link "python" } " vocab and its subvocabs implements a simple binding for libpython, allowing factor code to call native python."
|
||||
|
@ -25,7 +25,7 @@ $nl
|
|||
"Initialization and finalization:"
|
||||
{ $subsections py-initialize py-finalize }
|
||||
"Module management:"
|
||||
{ $subsections import }
|
||||
{ $subsections py-import }
|
||||
"The vocab " { $vocab-link "python.syntax" } " implements a higher level factorific interface on top of the lower-level constructs in this vocab. Prefer to use that vocab most of the time."
|
||||
{ $notes "Sometimes the embedded python interpreter can't find or finds the wrong load path to it's module library. To counteract that problem it is recommended that the " { $snippet "PYTHONHOME" } " environment variable is set before " { $link py-initialize } " is called. E.g:" }
|
||||
{ $code "\"C:/python27-64bit/\" \"PYTHONHOME\" set-os-env" } ;
|
||||
|
|
|
@ -9,52 +9,52 @@ py-initialize
|
|||
|
||||
[ t ] [ Py_GetVersion string? ] unit-test
|
||||
|
||||
[ "os" ] [ "os" import PyModule_GetName ] py-test
|
||||
[ "os" ] [ "os" py-import PyModule_GetName ] py-test
|
||||
|
||||
[ t ] [
|
||||
"os" import "getpid" getattr
|
||||
{ } >py call-object >factor 0 >
|
||||
"os" py-import "getpid" getattr
|
||||
{ } >py call-object py> 0 >
|
||||
] py-test
|
||||
|
||||
[ t ] [ Py_IsInitialized ] py-test
|
||||
|
||||
! Importing
|
||||
! py-importing
|
||||
[ { "ImportError" "No module named kolobi" } ] [
|
||||
[ "kolobi" import ] [ [ type>> ] [ message>> ] bi 2array ] recover
|
||||
[ "kolobi" py-import ] [ [ type>> ] [ message>> ] bi 2array ] recover
|
||||
] py-test
|
||||
|
||||
! setattr
|
||||
[ 73 ] [
|
||||
"sys" import "testit" [ 73 >py setattr ] [ getattr >factor ] 2bi
|
||||
"sys" py-import "testit" [ 73 >py setattr ] [ getattr py> ] 2bi
|
||||
] py-test
|
||||
|
||||
! Tuples
|
||||
[ 2 ] [ 2 <py-tuple> py-tuple-size ] py-test
|
||||
|
||||
: py-date>factor ( py-obj -- timestamp )
|
||||
{ "year" "month" "day" } [ getattr >factor ] with map
|
||||
: py-datepy> ( py-obj -- timestamp )
|
||||
{ "year" "month" "day" } [ getattr py> ] with map
|
||||
first3 0 0 0 instant <timestamp> ;
|
||||
|
||||
! Lists
|
||||
[ t ] [ V{ 4 8 15 16 23 42 } dup >py >factor = ] py-test
|
||||
[ t ] [ V{ 4 8 15 16 23 42 } dup >py py> = ] py-test
|
||||
|
||||
! ! Datetimes
|
||||
[ t ] [
|
||||
[ py-date>factor ] "date" py-type-dispatch get set-at
|
||||
"datetime" import "date" getattr "today" getattr
|
||||
{ } >py call-object >factor
|
||||
[ py-datepy> ] "date" py-type-dispatch get set-at
|
||||
"datetime" py-import "date" getattr "today" getattr
|
||||
{ } >py call-object py>
|
||||
today instant >>gmt-offset =
|
||||
] py-test
|
||||
|
||||
! Unicode
|
||||
[ "غثههح" ] [
|
||||
"os.path" import "basename" getattr { "غثههح" } >py call-object >factor
|
||||
"os.path" py-import "basename" getattr { "غثههح" } >py call-object py>
|
||||
] py-test
|
||||
|
||||
! Instance variables
|
||||
[ 7 ] [
|
||||
"datetime" import "timedelta" getattr
|
||||
{ 7 } >py call-object "days" getattr >factor
|
||||
"datetime" py-import "timedelta" getattr
|
||||
{ 7 } >py call-object "days" getattr py>
|
||||
] py-test
|
||||
|
||||
! Create a dictonary
|
||||
|
@ -74,7 +74,7 @@ py-initialize
|
|||
[ 33 ] [
|
||||
<py-dict> "tjaba"
|
||||
[ 33 >py py-dict-set-item-string ]
|
||||
[ py-dict-get-item-string >factor ] 2bi
|
||||
[ py-dict-get-item-string py> ] 2bi
|
||||
] py-test
|
||||
|
||||
! Nest dicts
|
||||
|
@ -92,21 +92,21 @@ py-initialize
|
|||
] py-test
|
||||
|
||||
! Round tripping!
|
||||
[ { "foo" { 99 77 } } ] [ { "foo" { 99 77 } } >py >factor ] py-test
|
||||
[ { "foo" { 99 77 } } ] [ { "foo" { 99 77 } } >py py> ] py-test
|
||||
|
||||
[ H{ { "foo" "bar" } { 3 4 } } ] [
|
||||
H{ { "foo" "bar" } { 3 4 } } >py >factor
|
||||
H{ { "foo" "bar" } { 3 4 } } >py py>
|
||||
] py-test
|
||||
|
||||
! Kwargs
|
||||
[ 2014 10 22 ] [
|
||||
"datetime" import "date" getattr
|
||||
"datetime" py-import "date" getattr
|
||||
{ } >py H{ { "year" 2014 } { "month" 10 } { "day" 22 } } >py
|
||||
call-object-full >factor
|
||||
call-object-full py>
|
||||
[ year>> ] [ month>> ] [ day>> ] tri
|
||||
] py-test
|
||||
|
||||
! Modules
|
||||
[ t ] [
|
||||
"os" import PyModule_GetDict dup Py_IncRef &Py_DecRef py-dict-size 100 >
|
||||
"os" py-import PyModule_GetDict dup Py_IncRef &Py_DecRef py-dict-size 100 >
|
||||
] py-test
|
||||
|
|
|
@ -23,7 +23,7 @@ SPECIALIZED-ARRAY: void*
|
|||
Py_IsInitialized [ Py_Finalize ] when ;
|
||||
|
||||
! Importing
|
||||
: import ( str -- module )
|
||||
: py-import ( str -- module )
|
||||
PyImport_ImportModule check-new-ref ;
|
||||
|
||||
! Unicodes
|
||||
|
@ -63,7 +63,7 @@ M: math:float (>py) PyFloat_FromDouble ;
|
|||
M: array (>py) [ (>py) ] map array>py-tuple ;
|
||||
M: hashtable (>py)
|
||||
<py-dict> swap dupd [
|
||||
swapd [ (>py) ] [ (>py) ] bi* py-dict-set-item
|
||||
swapd [ (>py) ] bi@ py-dict-set-item
|
||||
] with assoc-each ;
|
||||
M: vector (>py)
|
||||
[ (>py) ] map vector>py-list ;
|
||||
|
@ -74,18 +74,18 @@ M: vector (>py)
|
|||
! Data marshalling to Factor
|
||||
SYMBOL: py-type-dispatch
|
||||
|
||||
DEFER: >factor
|
||||
DEFER: py>
|
||||
|
||||
: init-py-type-dispatch ( -- table )
|
||||
H{
|
||||
{ "NoneType" [ drop f ] }
|
||||
{ "bool" [ PyObject_IsTrue 1 = ] }
|
||||
{ "dict" [ PyDict_Items (check-ref) >factor >hashtable ] }
|
||||
{ "dict" [ PyDict_Items (check-ref) py> >hashtable ] }
|
||||
{ "int" [ PyInt_AsLong ] }
|
||||
{ "list" [ py-list>vector [ >factor ] map ] }
|
||||
{ "list" [ py-list>vector [ py> ] map ] }
|
||||
{ "long" [ PyLong_AsLong ] }
|
||||
{ "str" [ PyString_AsString (check-ref) ] }
|
||||
{ "tuple" [ py-tuple>array [ >factor ] map ] }
|
||||
{ "tuple" [ py-tuple>array [ py> ] map ] }
|
||||
{ "unicode" [ py-unicode>utf8 ] }
|
||||
} clone ;
|
||||
|
||||
|
@ -93,6 +93,6 @@ py-type-dispatch [ init-py-type-dispatch ] initialize
|
|||
|
||||
ERROR: missing-type type ;
|
||||
|
||||
: >factor ( py-obj -- obj )
|
||||
: py> ( py-obj -- obj )
|
||||
dup "__class__" getattr "__name__" getattr PyString_AsString
|
||||
py-type-dispatch get ?at [ call( x -- x ) ] [ missing-type ] if ;
|
||||
|
|
|
@ -30,7 +30,7 @@ HELP: PY-METHODS:
|
|||
"PY-FROM: zipfile => ZipFile ( name mode -- file ) ;"
|
||||
"PY-METHODS: ZipFile => namelist ( self -- names ) ;"
|
||||
"! Then use the declarations like this"
|
||||
"\"name-of-zip.zip\" >py \"r\" >py ZipFile namelist >factor"
|
||||
"\"name-of-zip.zip\" >py \"r\" >py ZipFile namelist py>"
|
||||
}
|
||||
} ;
|
||||
|
||||
|
@ -42,13 +42,13 @@ $nl
|
|||
"PY-FROM: zipfile => ZipFile ( name mode -- file ) ;"
|
||||
"PY-METHODS: ZipFile => namelist ( self -- names ) ;"
|
||||
"! Then use the declarations like this"
|
||||
"\"name-of-zip.zip\" >py \"r\" >py ZipFile namelist >factor"
|
||||
"\"name-of-zip.zip\" >py \"r\" >py ZipFile namelist py>"
|
||||
}
|
||||
"In python, a method or function takes keyword arguments if its last parameter starts with \"**\". If the name of the last argument to a declared function is \"**\" then a " { $link hashtable } " can be sent to the function:"
|
||||
{ $code
|
||||
"PY-FROM: datetime => timedelta ( ** -- timedelta ) ;"
|
||||
"PY-METHODS: timedelta => seconds ( self -- n ) ;"
|
||||
"H{ { \"hours\" 99 } { \"minutes\" 33 } } >py timedelta $seconds >factor ."
|
||||
"H{ { \"hours\" 99 } { \"minutes\" 33 } } >py timedelta $seconds py> ."
|
||||
"12780"
|
||||
}
|
||||
} ;
|
||||
|
|
|
@ -3,22 +3,22 @@ python python.ffi python.objects python.syntax python.tests sequences sets
|
|||
splitting tools.test unicode.categories ;
|
||||
IN: python.syntax.tests
|
||||
|
||||
! Importing functions
|
||||
! py-importing functions
|
||||
PY-FROM: os =>
|
||||
getpid ( -- y )
|
||||
system ( x -- y ) ;
|
||||
|
||||
[ t ] [ getpid >factor integer? ] unit-test
|
||||
[ t ] [ getpid py> integer? ] unit-test
|
||||
|
||||
! ! Automatic tuple unpacking
|
||||
PY-FROM: os.path =>
|
||||
basename ( x -- x' )
|
||||
splitext ( x -- base ext ) ;
|
||||
|
||||
[ "hello.doc" ] [ "/some/path/hello.doc" >py basename >factor ] unit-test
|
||||
[ "hello.doc" ] [ "/some/path/hello.doc" >py basename py> ] unit-test
|
||||
|
||||
[ { "hello" ".doc" } ] [
|
||||
"hello.doc" >py splitext 2array [ >factor ] map
|
||||
"hello.doc" >py splitext 2array [ py> ] map
|
||||
] unit-test
|
||||
|
||||
PY-FROM: time => sleep ( n -- ) ;
|
||||
|
@ -28,7 +28,7 @@ PY-FROM: time => sleep ( n -- ) ;
|
|||
! Module variables are bound as zero-arg functions
|
||||
PY-FROM: sys => path ( -- seq ) argv ( -- seq ) ;
|
||||
|
||||
[ t ] [ $path >factor sequence? ] unit-test
|
||||
[ t ] [ $path py> sequence? ] unit-test
|
||||
|
||||
PY-FROM: __builtin__ =>
|
||||
callable ( obj -- ? )
|
||||
|
@ -39,39 +39,39 @@ PY-FROM: __builtin__ =>
|
|||
range ( n -- seq )
|
||||
repr ( obj -- str ) ;
|
||||
|
||||
[ t ] [ $path len int >factor 5 > ] unit-test
|
||||
[ t ] [ $path len int py> 5 > ] unit-test
|
||||
|
||||
[ 10 ] [ 10 >py range len >factor ] unit-test
|
||||
[ 10 ] [ 10 >py range len py> ] unit-test
|
||||
|
||||
! Callables
|
||||
[ t ] [
|
||||
"os" import "getpid" getattr
|
||||
"os" py-import "getpid" getattr
|
||||
[ callable ] [ PyCallable_Check 1 = ] bi and
|
||||
] unit-test
|
||||
|
||||
! Reference counting
|
||||
PY-FROM: sys => getrefcount ( obj -- n ) ;
|
||||
|
||||
[ 2 ] [ 3 <py-tuple> getrefcount >factor ] unit-test
|
||||
[ 2 ] [ 3 <py-tuple> getrefcount py> ] unit-test
|
||||
|
||||
[ -2 ] [
|
||||
H{ { "foo" 33 } { "bar" 44 } } >py
|
||||
[ "foo" py-dict-get-item-string getrefcount >factor ]
|
||||
[ "foo" py-dict-get-item-string getrefcount py> ]
|
||||
[
|
||||
'[
|
||||
500 [ _ "foo" py-dict-get-item-string drop ] times
|
||||
] with-destructors
|
||||
]
|
||||
[ "foo" py-dict-get-item-string getrefcount >factor ] tri -
|
||||
[ "foo" py-dict-get-item-string getrefcount py> ] tri -
|
||||
] py-test
|
||||
|
||||
[ -2 ] [
|
||||
"abcd" >py <1py-tuple>
|
||||
[ 0 py-tuple-get-item getrefcount >factor ]
|
||||
[ 0 py-tuple-get-item getrefcount py> ]
|
||||
[
|
||||
[ 100 [ swap 0 py-tuple-get-item drop ] with times ] with-destructors
|
||||
]
|
||||
[ 0 py-tuple-get-item getrefcount >factor ] tri -
|
||||
[ 0 py-tuple-get-item getrefcount py> ] tri -
|
||||
] py-test
|
||||
|
||||
PY-METHODS: file =>
|
||||
|
@ -82,7 +82,7 @@ PY-METHODS: file =>
|
|||
[ t ] [
|
||||
"python-file" temp-file >py "wb" >py open
|
||||
[ tell ] [ fileno ] [ close ] tri
|
||||
[ >factor integer? ] bi@ and
|
||||
[ py> integer? ] bi@ and
|
||||
] py-test
|
||||
|
||||
PY-METHODS: str =>
|
||||
|
@ -94,11 +94,11 @@ PY-METHODS: str =>
|
|||
|
||||
! Method chaining
|
||||
[ t ] [
|
||||
"hello there" >py title 20 >py zfill "00" >py startswith >factor
|
||||
"hello there" >py title 20 >py zfill "00" >py startswith py>
|
||||
] py-test
|
||||
|
||||
[ { "hello" "=" "there" } ] [
|
||||
"hello=there" >py "=" >py partition 3array [ >factor ] map
|
||||
"hello=there" >py "=" >py partition 3array [ py> ] map
|
||||
] py-test
|
||||
|
||||
! Introspection
|
||||
|
@ -108,7 +108,7 @@ PY-METHODS: func =>
|
|||
PY-METHODS: code =>
|
||||
co_argcount ( code -- n ) ;
|
||||
|
||||
[ 1 ] [ $splitext $func_code $co_argcount >factor ] py-test
|
||||
[ 1 ] [ $splitext $func_code $co_argcount py> ] py-test
|
||||
|
||||
! Change sys.path
|
||||
PY-METHODS: list =>
|
||||
|
@ -116,7 +116,7 @@ PY-METHODS: list =>
|
|||
remove ( list obj -- ) ;
|
||||
|
||||
[ t ] [
|
||||
$path "test" >py [ append ] [ drop >factor ] [ remove ] 2tri
|
||||
$path "test" >py [ append ] [ drop py> ] [ remove ] 2tri
|
||||
"test" swap in?
|
||||
] py-test
|
||||
|
||||
|
@ -124,14 +124,14 @@ PY-METHODS: list =>
|
|||
PY-FROM: sys => platform ( -- x ) ;
|
||||
|
||||
[ t ] [
|
||||
$platform "sys" import "platform" "tjaba" >py setattr $platform =
|
||||
$platform "sys" py-import "platform" "tjaba" >py setattr $platform =
|
||||
] py-test
|
||||
|
||||
! Support for kwargs
|
||||
PY-FROM: datetime => timedelta ( ** -- timedelta ) ;
|
||||
|
||||
[ "datetime.timedelta(4, 10800)" ] [
|
||||
H{ { "hours" 99 } } >py timedelta repr >factor
|
||||
H{ { "hours" 99 } } >py timedelta repr py>
|
||||
] py-test
|
||||
|
||||
! Kwargs in methods
|
||||
|
@ -144,7 +144,7 @@ PY-METHODS: ArgumentParser =>
|
|||
[
|
||||
ArgumentParser dup
|
||||
"--foo" >py H{ { "help" "badger" } } >py add_argument
|
||||
format_help >factor
|
||||
format_help py>
|
||||
] with-destructors [ blank? ] trim " " split "badger" swap in?
|
||||
] py-test
|
||||
|
||||
|
|
Loading…
Reference in New Issue