Piszę interfejs FFI dla istniejącej biblioteki (napisanej w C).FFI in Squeak: Singleton ExternalLibrary vs. metody klas a metody w ExternalStructures?
Biblioteka korzysta z dużej liczby nieprzezroczystych struktur, dlatego zdefiniowałem kilka ExternalStructures
(bez pól) do użycia jako void*
.
Teraz widziałem dwa sposoby (lub cztery?) O relacje z biblioteką:
mającą ExternalLibrary
z jednej metody funkcji eksportowanej: To może mieć metodę w klasie instancji, a następnie użyć wzór singleton ma jedną instancję. Lub wdrożenie metod w klasie z boku „bardziej złożonych” składni tym moduleName
w Pragma FFI jak w:
ffiTestFloats: f1 with: f2
"FFITestLibrary ffiTestFloats: $A with: 65.0"
<cdecl: float 'ffiTestFloats' (float float) module:'SqueakFFIPrims'>
^self externalCallFailed
Co jest lepsze?
Dodatkowo widziałem inny sposób robienia tego, nie mając w ogóle ExternalLibrary
i implementując metody bezpośrednio w ExternalStructure
. Ta druga część jest lepsza, jednak cała definicja interfejsu FFI jest rozłożona na kilka klas, a obsługa i przenoszenie na inne platformy, dialekty Smalltalk lub wersje bibliotek mogą być bardziej złożone.
Co to jest "właściwy" sposób na zrobienie tego?
Nie wiem, która jest metoda skrzypienia, ale podoba mi się podejście biblioteki zewnętrznej za pomocą jednej metody dla każdej wyeksportowanej funkcji. Również posiadanie metod w ExternalStructure może być trudne, ponieważ może istnieć kilka struktur lub nikt w ogóle dla niektórych funkcji. –