ftp.nice.ch/pub/next/developer/languages/scheme/s48.I.bs.tar.gz#/s48/doc/external.txt

This is external.txt in view mode; [Download] [Up]

		       External function calls


(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.

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:

 1) If you're using ultrix, link the VM using -N.

 2) Use the -o flag to pass the name of the executable to the VM.
    [This is done automatically by the "scheme48" shell script created
    by "make install".]

 3) Use -G 0 when compiling the code to be dynamically linked.

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.


; Transcript:

% scheme48vm -i scheme48.image -o ~/bin/scheme48vm

Welcome to Scheme 48 0.20 (made by jar on Wed Jun 23 11:39:53 EDT 1993).
Copyright (c) 1993 by Richard Kelsey and Jonathan Rees.
Please report bugs to scheme48-bugs@altdorf.ai.mit.edu.
Type ,? (comma question-mark) for help.
> ,open externals
Load structure externals (y/n)? y
[externals
/sw/scheme48/big/external.scm ...............
]
> (define dynamic-load (get-external "s48_dynamic_load"))
> (external-call dynamic-load (null-terminate "test.o"))
#t
> 

It have to be (get-external "_s48_dynamic_load") on some versions of
Unix (like SGI perhaps).

Sample C file:

#include "/sw/scheme48/scheme48.h"
#include <stdio.h>

scheme_value test (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");
  }
}

-----

[Original by RK, modifications by JAR 6/24/93 and 12/21/93]

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.