From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Paul Emsley Newsgroups: gmane.lisp.guile.user Subject: Re: Guile + SWIG Date: Mon, 05 Apr 2021 18:44:44 +0100 Message-ID: References: <65bb42ce8d587b284b70d48f2f4b0c99e5c37cf7.camel@mrc-lmb.cam.ac.uk> <2a6711742cea0cf53342f70a2941b26e48efd864.camel@linas.org> Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="11019"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Evolution 3.34.1-2 To: Linas Vepstas , Guile User Mailing List Original-X-From: guile-user-bounces+guile-user=m.gmane-mx.org@gnu.org Mon Apr 05 19:47:28 2021 Return-path: Envelope-to: guile-user@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1lTTJv-0002gS-Ln for guile-user@m.gmane-mx.org; Mon, 05 Apr 2021 19:47:27 +0200 Original-Received: from localhost ([::1]:34464 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1lTTJu-0007Pe-Fg for guile-user@m.gmane-mx.org; Mon, 05 Apr 2021 13:47:26 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:59900) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lTTHV-0007NO-Nr for guile-user@gnu.org; Mon, 05 Apr 2021 13:44:57 -0400 Original-Received: from ppsw-42.csi.cam.ac.uk ([131.111.8.142]:48726) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1lTTHQ-0004LP-77 for guile-user@gnu.org; Mon, 05 Apr 2021 13:44:57 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=cam.ac.uk; s=20180806.ppsw; h=Content-Transfer-Encoding:MIME-Version:Content-Type: References:In-Reply-To:Date:To:From:Subject:Message-ID:Sender:Reply-To:Cc: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=bzuWf0VrRdeFOCQgglcknavbF3HkwaMeQ1CmWPvHgUQ=; b=A07iPQJHLy7ryzzitfJP3vluPT gj1hp8BbuIbbkHMf1BgoqzEEcpoPt7h5+nrOWCnr/Wn6nG8Crjpb+ZZ2yZXCgrBqXs6HqV7M5v5TL 5QsF+8k7IebYuCxc3JEO94K6R7YgSt4b3JVK4gao7ha8Zqhw8E1qhp9sJp61Z8ci8dxU=; X-Cam-AntiVirus: no malware found X-Cam-ScannerInfo: http://help.uis.cam.ac.uk/email-scanner-virus Original-Received: from mail.mrc-lmb.cam.ac.uk ([131.111.85.9]:41190 helo=mail.lmb.internal) by ppsw-42.csi.cam.ac.uk (ppsw.cam.ac.uk [131.111.8.138]:25) with esmtp id 1lTTHL-0007xh-7g (Exim 4.94) (return-path ); Mon, 05 Apr 2021 18:44:47 +0100 Original-Received: from 79-77-210-255.dynamic.dsl.as9105.com ([79.77.210.255] helo=penelope) by mail.lmb.internal with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.92.3) (envelope-from ) id 1lTTHL-001Ilz-3s; Mon, 05 Apr 2021 18:44:47 +0100 In-Reply-To: <2a6711742cea0cf53342f70a2941b26e48efd864.camel@linas.org> Received-SPF: pass client-ip=131.111.8.142; envelope-from=pemsley@mrc-lmb.cam.ac.uk; helo=ppsw-42.csi.cam.ac.uk X-Spam_score_int: -41 X-Spam_score: -4.2 X-Spam_bar: ---- X-Spam_report: (-4.2 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_MED=-0.001, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_MED=-2.3, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001, URIBL_SBL_A=0.1 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: guile-user@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: General Guile related discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guile-user-bounces+guile-user=m.gmane-mx.org@gnu.org Original-Sender: "guile-user" Xref: news.gmane.io gmane.lisp.guile.user:17399 Archived-At: Hi Linas, Thanks for your reply. Let me clarify if I can. I have many C++ functions that I would like to use from scheme. I am using SWIG to generate wrappers for these functions, and these get added at the "root module" http://www.swig.org/Doc3.0/Guile.html The default linkage is the simplest; nothing special is done. In this case the function SWIG_init() is exported. Simple linkage can be used in several ways: Embedded Guile, no modules. You want to embed a Guile interpreter into your program; all bindings made by SWIG shall show up in the root module. Then call SWIG_init() in the inner_main() function So that is what I was trying to do. My understanding was that enhanced-ligand-coot-p and its friends would be added so that their usage would be no different to list, string?, map and any number of basic scheme functions. However something is amiss. If I try this: ./coot Enter `,help' for help. scheme@(guile-user)> (load "test-embedding.scm") (55555555555555 #f) Now, if I install that in $prefix/share/guile/site If I try this: ./coot Enter `,help' for help. scheme@(guile-user)> (use-modules (test-embedding)) While compiling expression: In procedure module-lookup: Unbound variable: enhanced-ligand-coot-p scheme@(guile-user)> Is that because the "compiler" doesn't know where enhanced-ligand-coot-p is? Maybe the compiler is not my application, so that's why it's not there? If that is the case, then can I not compile my .scm files? How to do that? Or can I somehow say "don't worry that it's not there now, when the application runs, it will be there"? Thanks, Paul. p.s. It's quite likely that Coot was used in the analysis of spike proteins from coronavirus that lead to 2P and hexapro stabilization mutants, and they have been taken up by the pharmaceutical companies and embedded into the mRNA or more conventional preps. So you can have some guile-1.8.8-based technology squirted into your arm next week. On Mon, 2021-04-05 at 10:27 -0500, Linas Vepstas wrote: > Hi Paul, > > Conventionally, a guile module would look something like > > > (define-module (test-embedding)) > (use-modules (srfi srfi-1)) ; .. etc > > (define (enhanced-ligand-coot-p) #t) ; etc. > > (export enhanced-ligand-coot-p) > > > In your example, you never explained how "enhanced-ligand-coot-p" > magically showed up in your environment. > > When a module is defined, it starts with a new environment. The module > cannot access stuff you've defined previously; you would have to import > it somehow. > > --linas > > > On Mon, 2021-04-05 at 11:24 +0100, Paul Emsley wrote: > > Hi, > > > > I am trying to bring my swigged Gtk2 + guile 1.8.8 + guile-gtk > > application up to date and I'd like some help please. > > > > My SWIG usage wraps many function, including > > enhanced_coot_ligand_p(). I am confused between the difference > > between > > functions that are available from C/C++ and those from a scheme > > script: > > > > if my inner_main looks like this: > > > > void inner_main(void *closure, int argc, char **argv) { > > > > SWIG_init(); > > std::string handler_string = "(lambda (key . args) "; > > handler_string += "(display (list \"Error in proc:\" key \" args: > > \" args)) (newline))"; > > SCM handler = scm_c_eval_string(handler_string.c_str()); > > std::string thunk_str = "(lambda() (display (list > > 444444444444444444 (enhanced-ligand-coot-p))) (newline))\n"; > > SCM thunk = scm_c_eval_string(thunk_str.c_str()); > > scm_catch(SCM_BOOL_T, thunk, handler); > > gtk_main(); > > > > } > > > > then I get on the terminal what I expected: > > > > (444444444444444444 #f) > > > > (i.e. enhanced-ligand-coot-p is evaluated) > > > > > > if my inner_main looks like this: > > void inner_main(void *closure, int argc, char **argv) { > > > > SWIG_init(); > > std::string handler_string = "(lambda (key . args) "; > > handler_string += "(display (list \"Error in proc:\" key \" args: > > \" args)) (newline))"; > > SCM handler = scm_c_eval_string(handler_string.c_str()); > > std::string thunk_str = "(use-modules (test- > > embedding))\n"; //////////// different /////////////// > > SCM thunk = scm_c_eval_string(thunk_str.c_str()); > > scm_catch(SCM_BOOL_T, thunk, handler); > > gtk_main(); > > > > } > > > > then I get: > > > > ;; compiling /home/paule/autobuild/Linux-pen-pre-release- > > gtk3/share/guile/site/test-embedding.scm > > ;;; test-embedding.scm:21:30: warning: possibly unbound variable > > `enhanced-ligand-coot-p' > > ;;; compiled /home/paule/.cache/guile/ccache/2.2-LE-8- > > 3.A/home/paule/autobuild/Linux-pen-pre-release- > > gtk3/share/guile/site/test-embedding.scm.go > > ------------------- test embedding! ----------------------- > > Backtrace: > > 18 (apply-smob/1 #) > > In ice-9/boot-9.scm: > > 2312:4 17 (save-module-excursion _) > > In ice-9/eval-string.scm: > > 38:6 16 (read-and-eval # #:lang _) > > In ice-9/eval.scm: > > 721:20 15 (primitive-eval _) > > In ice-9/psyntax.scm: > > 1262:36 14 (expand-top-sequence _ _ _ #f _ _ _) > > 1209:24 13 (parse _ (("placeholder" placeholder)) ((top) #(# # …)) > > …) > > 285:10 12 (parse _ (("placeholder" placeholder)) (()) _ c&e (eval) > > …) > > In ice-9/boot-9.scm: > > 3377:20 11 (process-use-modules _) > > 222:17 10 (map1 (((test-embedding)))) > > 3378:31 9 (_ ((test-embedding))) > > 2800:17 8 (resolve-interface (test-embedding) #:select _ #:hide _ > > …) > > In ice-9/threads.scm: > > 390:8 7 (_ _) > > In ice-9/boot-9.scm: > > 2726:13 6 (_) > > In ice-9/threads.scm: > > 390:8 5 (_ _) > > In ice-9/boot-9.scm: > > 2994:20 4 (_) > > 2312:4 3 (save-module-excursion _) > > 3014:26 2 (_) > > In unknown file: > > 1 (primitive-load-path "test-embedding" # > 7f98d…>) > > In test-embedding.scm: > > 19:0 0 (_) > > > > test-embedding.scm:4:0: In procedure module-lookup: Unbound variable: > > enhanced-ligand-coot-p > > > > > > > > test-embedding.scm looks like this and is installed in > > $prfx/share/guile/site > > > > (display "------------- test embedding! ------------\n") > > (display (list 55555555555555 (enhanced-ligand-coot-p))) > > (newline) > > > > > > So, inner_main() knows that enhanced-ligand-coot-p is available, but > > the scheme script does not. I don't know how to > > resolve this. > > > > How do I get a list of the available functions? > > > > Thanks in advance for your help. > > > > Paul. > > > > > >