From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: ludo@gnu.org (Ludovic =?iso-8859-1?Q?Court=E8s?=) Newsgroups: gmane.lisp.guile.user Subject: Re: Long-lived Guile scripts in a mono-threaded game engine Date: Tue, 27 May 2008 09:58:46 +0200 Message-ID: <87fxs4yy89.fsf@gnu.org> References: <20080526211900.GB14261@perso.beuc.net> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: ger.gmane.org 1211875162 26441 80.91.229.12 (27 May 2008 07:59:22 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Tue, 27 May 2008 07:59:22 +0000 (UTC) To: guile-user@gnu.org Original-X-From: guile-user-bounces+guile-user=m.gmane.org@gnu.org Tue May 27 09:59:53 2008 Return-path: Envelope-to: guile-user@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1K0u61-0008Re-DR for guile-user@m.gmane.org; Tue, 27 May 2008 09:59:49 +0200 Original-Received: from localhost ([127.0.0.1]:38477 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1K0u5G-0004FU-BD for guile-user@m.gmane.org; Tue, 27 May 2008 03:59:02 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1K0u5B-0004F6-SK for guile-user@gnu.org; Tue, 27 May 2008 03:58:57 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1K0u5B-0004Ei-1c for guile-user@gnu.org; Tue, 27 May 2008 03:58:57 -0400 Original-Received: from [199.232.76.173] (port=48037 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1K0u5A-0004Ed-J9 for guile-user@gnu.org; Tue, 27 May 2008 03:58:56 -0400 Original-Received: from main.gmane.org ([80.91.229.2]:51849 helo=ciao.gmane.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1K0u5A-0007WU-27 for guile-user@gnu.org; Tue, 27 May 2008 03:58:56 -0400 Original-Received: from list by ciao.gmane.org with local (Exim 4.43) id 1K0u57-0003Lq-J4 for guile-user@gnu.org; Tue, 27 May 2008 07:58:53 +0000 Original-Received: from 193.50.110.184 ([193.50.110.184]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Tue, 27 May 2008 07:58:53 +0000 Original-Received: from ludo by 193.50.110.184 with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Tue, 27 May 2008 07:58:53 +0000 X-Injected-Via-Gmane: http://gmane.org/ Original-Lines: 53 Original-X-Complaints-To: usenet@ger.gmane.org X-Gmane-NNTP-Posting-Host: 193.50.110.184 X-URL: http://www.fdn.fr/~lcourtes/ X-Revolutionary-Date: 9 Prairial an 216 de la =?iso-8859-1?Q?R=E9volution?= X-PGP-Key-ID: 0xEA52ECF4 X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc X-PGP-Fingerprint: 821D 815D 902A 7EAB 5CEE D120 7FBA 3D4F EB1F 5364 X-OS: i686-pc-linux-gnu User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.1 (gnu/linux) Cancel-Lock: sha1:iLEYj2gQ7DCjUOIiZSbvqOB/m7M= X-detected-kernel: by monty-python.gnu.org: Linux 2.6, seldom 2.4 (older, 4) X-BeenThere: guile-user@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: General Guile related discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: guile-user-bounces+guile-user=m.gmane.org@gnu.org Errors-To: guile-user-bounces+guile-user=m.gmane.org@gnu.org Xref: news.gmane.org gmane.lisp.guile.user:6574 Archived-At: Hi Sylvain, Sylvain Beucler writes: > I'm contemplating adding Guile support in GNU FreeDink, which is a > game engine for Dink Smallwood, a 2D scripted game. Nice. :-) > Scripts last more than a single game loop. They are not basic scripts > that describe what happens in a single engine step; instead they > describe what happens in the story. > > For example, a game introduction will create sprites on the screen, > move them around, make them say lines that the user can read (or pass > using [space]), etc. > > That script can also change the current screen (which kills all other > scripts in the current script). > > Multiple scripts can run in a single screen, but they run the one > after the other, not in parallel. The order/priority is known. > > Scripting is essentially frozen during the screen refresh. This avoids > putting mutexes everywhere. > > > > > How could I do something similar with Guile? I didn't find a way to > make a guile script pause (and return to the caller). IIUC, "scripts" are only invoked via hooks, e.g., the engine wants to ask them to do something specific. If that is the case, it suffices to not invoke the script. Surely you can implement coroutine-like behavior, either using `call/cc' (but that is going to be prohibitively expensive), or using explicit continuation-passing style or similar. For instance, when a hook is called by the engine, it would systematically return a thunk (a zero-argument procedure) that the engine would later invoke. Example: (define (my-hook action) (let ((stuff (do-some-computation action))) (lambda () ;; This will be executed at some later point, when the engine ;; feels like invoking it. (do-the-remaining-computation stuff)))) Does this help? Thanks, Ludovic.