guile-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

C++ wrap


From: Hans Aberg
Subject: C++ wrap
Date: Mon, 22 Feb 2010 15:01:29 +0100

I have written a bit on a C++ wrap - has this been done? I use templates to get a static typed style similar to that of Haskell, which can be overridden at need. Some example code below.

  Hans


----
#include "src/guile.hh"

#include <iostream>
#include <list>
#include <utility>


int inner_main(std::pair<int, char**>* argp) {
  for (int i = 0; i < argp->first; ++i)
    std::cout << argp->second[i] << std::endl;

  using namespace scm;

  integer x = 2567575364397498ull;
  integer y = (uint64_t)2567575364397500ull;

  out << "-x = " << -x << "\ny = " << y << newline;

  // Checking object references and mutative operations:
  object w = x;
  ++x;
  out << "w = " << w << newline;
  out << "x = " << x << newline;

  function2<integer, integer, integer> f("-");
  // Using C++ output:
  std::cout << "f(x, y) = " << (char*)string(f(x, y), 10) << std::endl;

  // Loading a module, and using a function in it:

  object("(use-modules (ice-9 pretty-print))");
  function<> pretty("pretty-print");

  const char* text =
  "'(define (foo) (lambda (x) \
  (cond ((zero? x) #t) ((negative? x) -x) (else \
  (if (= x 1) 2 (* x x x))))))";

  out << "Function:\n";
  pretty(object(text));

  list<> ks(std::list<integer>(5, 6));
  out << "std::list<integer>(5, 6) = " << ks << newline << flush;

  function1<number, number> inc("(lambda (x) (+ x 1))");
  out << "inc(integer(3)) = " << inc(integer(3)) << newline;

  return EXIT_SUCCESS;
}


int main(int argc, char **argv) {
  std::pair<int, char**> arg(argc, argv);
return scm::with_guile<std::pair<int, char**>*, int>(inner_main) (&arg);
}
----
$ g++ test.cc -lguile -o test && ./test
./test

-x = -2567575364397498
y = 2567575364397500
f(x, y) = -2
Function:
(define (foo)
  (lambda (x)
    (cond ((zero? x) #t)
          ((negative? x) -x)
          (else (if (= x 1) 2 (* x x x))))))
std::list<integer>(5, 6) = (6 6 6 6 6)
inc(integer(3)) = 4
----





reply via email to

[Prev in Thread] Current Thread [Next in Thread]