Приложение: FFI для держателя целочисленной стоимости
Вот как использовать FFI для чего-то вроде:
"int get_by_filling_pointer(int *value);" FFIExternalValueHolder subclass: DemoFFIIntegerValue DemoFFIIntegerValue>>typeDecl ^ 'int' FFILibrary subclass: DemoFFILibrary DemoFFILibrary>>apiGetValue: valueHolder ^ self ffiCall: #( int get_by_filling_pointer(DemoFFIIntegerValue valueHolder) ) Object subclass: DemoFFIThing DemoFFIThing>>getViaValueHolder | vh | vh := DemoFFIIntegerValue new. ((DemoFFILibrary uniqueInstance apiGetValue: vh) = 1) ifFalse: [ DemoFFIError signal: 'bummer' ] ifTrue: [ ^ vh value ] Error subclass: DemoFFIError
Работа с «int *value» в функции C не очевидна в Smalltalk. Ключевым моментом является использование специального класса под названием #FFIExternalValueHolder, который представляет собой способ эмуляции указателей в Smalltalk.