unofficial mirror of guile-user@gnu.org 
 help / color / mirror / Atom feed
From: ludo@gnu.org (Ludovic Courtès)
To: guile-user@gnu.org
Subject: Re: Long-lived Guile scripts in a mono-threaded game engine
Date: Tue, 27 May 2008 15:20:55 +0200	[thread overview]
Message-ID: <87hccjnars.fsf@gnu.org> (raw)
In-Reply-To: 20080527083324.GA16693@perso.beuc.net

Salut,

Sylvain Beucler <beuc@beuc.net> writes:

> Here's a sample script (very close to the C bindings, for a start):
>
> (define (hit)
>   (if (> (sp_gethitpoints (current_sprite)) 10)
>     (begin
>       (sp_sethitpoints (current_sprite) (- (sp_hitpoints (current_sprite)) 10))
>       (dialog1))
>     (begin
>       (say_stop "ARRRRrr.." (current_sprite))
>       (sp_kill (current_sprite) 0)
>       (say_stop "Uh, I was supposed to protect him, not kill him!" 1)))
>   (set_honour! (- (get_honour) 1)))
>
> (define (dialog1)
>   (say_stop "Why are you hitting me, player?" (current_sprite))
>   (say_stop "Uh, sorry I won't do that again" 1))
>
>
> Now every time we see a (say_stop), the script will pause for 2
> seconds, so the player can read the text.

IOW, `say_stop' does a `(sleep 2)' (or `sleep (2)'), or waits for some
UI event, is that right?

> If I use CPS, this means I'll have to rewrite all my scripts in CPS
> style.

Yes, but you said this was work-in-progress, so I suppose there's no
backward compatibility concern.  ;-)

> This would be pretty cumbersome. This is supposed to introduce
> people to the beautiful world of scheme, not scare them to death ;)

Well, it's not necessarily that scary, and it depends on how often you'd
have to use it.

> call/cc has another issue: how do I return? Let's say I'm in the
> middle of (dialog1) and I need to stop the script. Maybe with a set of
> double continuations: one continuation at the top level to return to
> the point before I called the initial procedure (which would stops the
> script); and another one that is set at each (say_stop) to return to
> the following line (to resume the script).

Yes, something like that: a continuation to invoke the "scheduler" (the
engine), which would be passed the continuation within `dialog1' that
needs to be resumed eventually.

> Hopefully this is not as inefficient as you suggested.

Depends on how often (and when) you do it, but expect it to be
inefficient as it copies the stack (see the "Continuations" node in the
manual).

It may actually be simpler to run the Scheme code in a separate POSIX
thread, and have it woken up by the engine when it should start working.

Thanks,
Ludovic.





  reply	other threads:[~2008-05-27 13:20 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-05-26 21:19 Long-lived Guile scripts in a mono-threaded game engine Sylvain Beucler
2008-05-27  7:58 ` Ludovic Courtès
2008-05-27  8:33   ` Sylvain Beucler
2008-05-27 13:20     ` Ludovic Courtès [this message]
2008-05-27 16:14       ` Sylvain Beucler
2008-05-27 18:08         ` Ludovic Courtès
2008-05-27 19:57           ` Sylvain Beucler
2008-05-27 20:30             ` Clinton Ebadi
2008-05-27 18:19         ` Clinton Ebadi
2008-05-27 21:49           ` Neil Jerram
2008-05-27 13:42     ` Paul Emsley

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/guile/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87hccjnars.fsf@gnu.org \
    --to=ludo@gnu.org \
    --cc=guile-user@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).