(GET-EXTERNAL string) Returns an external pointer to the given name. A null will be added to the end of the name if there isn't already one.
(LOOKUP-ALL-EXTERNALS) Looks up all externals in the currently job. Ideally this should be called automatically on startup.
(EXTERNAL-CALL external arg1 arg2 ...) Calls the external value, passing it the number of arguments (as a long), and a pointer to a C array containing the rest of the arguments (also a long). Don't mess with the array, it is really the Scheme 48 argument stack. The arguments are probably in reverse order, I can't remember.
(NULL-TERMINATE string)
The file dynload.c contains the function s48_dynamic_load which can be called using EXTERNAL-CALL. To make it work you need to do the following:
If dynamic loading doesn't work you can always link the external stuff in with the VM. The dynamic loading code has problems. I am not much of a Unix hacker.
Here is a transcript on SunOS 4.something:
kama$ gcc -fpic -c test.c kama$ /bin/ld -assert pure-text -o test.so test.o kama$ file test.so test.so: sparc demand paged shared library executable not stripped kama$ kama$ scheme48 Welcome to Scheme 48 0.31 (made by jar on Sun Feb 13 18:33:57 EST 1994). Copyright (c) 1993, 1994 by Richard Kelsey and Jonathan Rees. Please report bugs to scheme-48-bugs@altdorf.ai.mit.edu. Type ,? (comma question-mark) for help. > ,open externals Load structure externals (y/n)? y [externals /usr/public/sun4/lib/scheme48/big/external.scm .............. ] > (define dynamic-load (get-external "s48_dynamic_load")) > (external-call dynamic-load (null-terminate "test.so")) #t > (define test (get-external "test")) > (external-call test "yow" 3) string: yow fixnum: 3 #t >
If using cc instead of gcc, do "cc -pic -c ...".
(get-external "_s48_dynamic_load") and (get-external "_test") might be required on some versions of Unix (like maybe SGI).
Here is file test.c:
#include "/usr/local/include/scheme48.h" #includescheme_value test (argc, argv) long argc; scheme_value *argv; { int i; for (i = argc-1; i >= 0; i--) { scheme_value arg = argv[i]; if (STRINGP(arg)) { printf ("string: "); fwrite(&STRING_REF(arg, 0), 1, STRING_LENGTH(arg), stdout); printf ("\n"); } else if (FIXNUMP(arg)) { printf("fixnum: %d\n", EXTRACT_FIXNUM(arg)); } else printf("?\n"); } return SCHTRUE; }
Ownership, Maintenance and Disclaimers
Last modified