a scheme
module that when loaded will display the number 3 (just for the
sake of an example).
I created a file test-lang/lang.scm with one expression in it and
compiled it. That created a cached .go file that defined the module.
Then I wrote the following script and ran it:
#! /home/mark/bui
(For example, Guile-SDL
> test/gfx.scm is a dog under Guile 2.x, blech.) Fingers crossed...
I'll be happy to do that if I come up with something!
Thanks
--
Mark Witmer
of SCM
objects they represent.
Thanks
--
Mark Witmer
ub.com/mwitmer/guile-xcb
Feel free to share your ideas, questions, or comments!
Thanks
--
Mark Witmer
━
GUILE-WM
Mark Witmer
m...@markwitmer.com
Mark H Weaver writes:
> Here's what happens on my Debian wheezy system, starting from a pristine
> git checkout (using "git clean -dxf"):
> ...
> ice-9/boot-9.scm:106:20: In procedure # ice-9/boot-9.scm:97:6 (thrown-k . args)>:
> ice-9/boot-9.scm:106:20: no
display
$2 = #
scheme@(guile-user)>
(define-method (display ...) ...) doesn't give me any errors, but
doesn't seem to affect the result of actually calling display on
anything. Am I missing something?
Thanks
--
Mark Witmer
(let ((arg-datum (syntax->datum #'arg)))
(if (not (defined? arg-datum))
#'(define arg val)
#'*unspecified*))
--
Mark Witmer
0 0 0 0 0 0 0))
This will obviously be the wrong authentication data for anyone else's X
server; however, even if X closes the socket prematurely (not that it's
supposed to, but it might), Guile shouldn't just crash, should it?
Thanks
--
Mark Witmer
s there's something I
need to do before connecting to the X server to ensure that it doesn't
hang up on me. Time to go look at the xcb C source code again...
> Hope this helps,
Thanks, I think it will, despite my apparent frustration. These encoding
issues were likely to crop up later even if they aren't the cause of my
current troubles.
--
Mark Witmer
- XPRINT is excluded because it's deprecated and its XML file has just
enough special cases in it that it wasn't worth including. Some
other deprecated extensions are included simply because there was no
reason not to.
--
Mark Witmer
think that
approach makes for very elegant nonblocking i/o, but it's been
performing well enough.
You can take a look at this for some more ideas (hopefully good ones):
https://github.com/mwitmer/guile-xcb/blob/prompts/xcb/xml/connection.scm
--
Mark Witmer
Mark H Weaver writes:
> m...@markwitmer.com writes:
>> Reading and writing to a socket seems to lend itself well to custom
>> binary ports,
>
> Why do you say that? For most purposes, Guile's native file ports are
> superior, and they seem the natural choice for s
> From: Doug Evans
> Date: Mon, 17 Feb 2014 02:39:25 -0500
>
> Hi.
>
> Here's my modest contribution to the Guile anniversary potluck.
>
> The patch to selftest-support.exp could be done differently,
> I've tried to keep it simple. The problem is that gdb with guile
> will get SIGPWR from time
Trying to install guile 2.0.11 on L-ubuntu 12.04. Shell is /bin/bash .
Downloaded the tarfile from the Gnu website.
configured with no options
make check produced warnings and "unresolved" messages and one failure,
bug 27450. It said "please report this" but I believe that as this is a
known
bug
Thank you for your most helpful replies. I did:
1: sudo ldconfig
Output:
/sbin/ldconfig.real: /usr/local/lib/libguile-2.0.so.22.7.2-gdb.scm is not
an
ELF file - it has the wrong magic bytes at the start.
2: pkg-config --cflags --libs guile-2.0
and now things are working (I have only don
> It looks like you just forgot to run ldconfig after installing guile.
The instructions did not tell me to do so.
Christopher Allan Webber writes:
> Hello all! I'm happy to announce the first public release of
> guile-sjson!
Congratulations!
> What's guile-sjson? Well, it's basically the previous work David
> Thompson did on (ice-9 json), but since that seemed to sit without being
> merged for a while a
New scheme user here.
Suppose I'm writing a spreadsheet. The user inputs a formula for a cell.
The plan is to use guile's peg parser to convert the formula into a
lambda expression, which I then compile in order to speed-up subsequent
processing.
So, suppose I convert the user's formula to a
On 20/02/18 00:08, Vítor De Araújo wrote:
We can try this out:
scheme@(guile-user)> (use-modules (system base compile))
scheme@(guile-user)> (define exp '(lambda (n)
(let loop ([i n] [total 0])
(if (= i 0)
: It is not clear to me how this will work. First of all, compile may
generate machine-dependent code.
That's OK. Generated code doesn't need to be saved. Formulae are
compiled as needed.
: Second, how do you propose to evaluate my-cell-formulae ?
To evaluate a cell, I would call ((hash-ref
I'm trying to use peg pattern matching to match quoted strings. It's not
complete, but I think I found a bug that is holding me back. consider
the following code:
(use-modules (ice-9 peg string-peg))
(use-modules (ice-9 peg using-parsers))
(define-peg-pattern DQ body "\"")
(define-peg-pattern a
My bad. I needed to do something like:
(define-peg-string-patterns "astring <-- DQ .*")
My original definition as
(define-peg-pattern astring body "(DQ .*)")
was just wrong.
amp;~a ~a ~a" a b c))
;; After some experimenting, I found the
;; following solution, but I'd rather not have
;; to deal with all the incessant quasiquote
;; and unquote stuff. Is there a more elegant
;; solution?
;;
;; Thanks in advance.
;; - Mark
(define (set-precision n)
(let* ((max-
I'm calling it, but is there
a way to make it do what I want?
(define my-alist
`((a 1)
(b ,(+ 1 (cadr (assq 'a my-alist))
Thanks.
- Mark
How can I get (alist-prepend) to operate
on the original alist?
Thanks,
Mark
The date listed on the primary web page for the GNU Guile 1.9.15
release is 2011-01-02 (2011 January 02), instead of the correct date
2011-02-02 (2011 February 02).
http://www.gnu.org/software/guile/
-Original Message-
From: Neil Jerram
To: Ludovic Courtès
Cc: guile-user@gnu.org; gu
'memq' and 'memv' are not returning sublists as documented if (quote...)
is used to specify the list that is to be searched. Instead, they are
returning #t. Is this expected (and undocumented) behavior?
(Note: 'member' returns the found sublist for both (list ...) and
(quote ...))
$ /usr/loc
On Tue, May 22, 2012 at 07:26:09AM -0700, nrichard wrote:
>
> hello my problem is to count occurence of letter in a text and come out with
> an assoc-list like
> '((a.16) (b.10) ... (z.5))
> i started a fee function but they don't work so please help me
>
> ;; an alist
> (define lettre '((""."")
;return 0;" and rest
easy knowing the gc will take care of the details?
Thanks
Mark Witmer
general SCM
numeric functions instead of the immediate number ones? These seem to
make up a large number of the deprecated functions in use by this
library.
Mark
unning.
A lot of this is inspired by Stumpwm, a pretty nifty tiling wm written
in common lisp that's similarly configurable.
I'll put the wm code on github as well as I get more features
added. Feedback and suggestions are welcome!
Mark Witmer
espace?
I decided I want to use xcb for my window manager, so I'm implementing a
language in guile that reads the xml files xcb uses to describe the X
protocol and creates bindings for it.
Thanks
Mark Witmer
e that it's far from complete. But I'll keep hacking away at it!
Thanks to everyone for the awesome work being done on the Guile core and
all the exciting projects cropping up around it. I've learned a lot by
following this list and guile-devel.
--
Mark Witmer
...)
scheme@(guile-user)> (let ((t 'inner-t)) (foo t))
[t=global-t] inner-t
$8 = #t
scheme@(guile-user)>
--8<---cut here---end--->8---
This macro is hygienic, and also easier to comprehend (IMO). Of course,
it could also be implemented using syntax-case. The key is to always
work with the syntax objects.
Whenever you use 'syntax->datum' on expressions that are not purely
literals, you will be sacrificing hygiene.
Regards,
Mark
;t' in the template of the 'foo'
macro should refer to the toplevel variable 't', because the template
does not appear within the 'let'.
This is a good example of why syntax objects are needed, to distinguish
between these two references to distinct variables named 't'. When you
convert the references to datums, the distinctions are lost.
Regards,
Mark
, in practice it would work in many common cases. That is
generally the case for unhygienic macros.
Best,
Mark
t here---end--->8---
So, more generally, unhygienic macros may cause problems when they are
used in combination with other macros. Since macros are so ubiquitous
in Scheme, attempting to avoid such combinations is likely to be
brittle.
Best,
Mark
s are
installed at the time of the error.
> There is no error report... until 5-10 minutes later, when the error
> report itself causes a crash. Before then, I get an endless
> high-speed spew of prints:
It looks like another error is happening within the exception handler.
Mark
PS: It would be good to pick either 'guile-devel' or 'guile-user' for
continuation of this thread. I don't see a reason why it should be
sent to both lists.
aside, is there a reason to not define it more simply as follows?
Mark
--8<---cut here---start->8---
(define-syntax define-api-route
(syntax-rules ()
[(define-api-route route http-method my-content-type)
;; `route` should be `/container/j
reedom somewhere else. In this case, the freedom to treat modules as
arbitrarily mutable objects implies a loss of freedom in the compiler to
make any assumptions about what's in the module or even its set of
bindings. That freedom carries a very significant cost.
Mark
>
> ERROR: Wrong type to apply: #
The problem here is that 'make-person' is a macro. Macros are expanded
at compile time, and must therefore be available at compile time.
When you compile 'm2.scm', those macros are not available, because
'load' only has effects at run-time, by design. Since there is no macro
definition for 'make-person' at compile-time, Guile's compiler generates
code that assumes it will be a procedure.
In summary, you cannot use 'load' to import macros from another module.
> For various reasons I must keep (load "module.scm") mechanism
If you can share those reasons, perhaps I can help you find another
solution.
Regards,
Mark
g to use it.
The problem is simply that the macro expands into a definition, and you
are trying to use it within an expression context, where definitions are
not allowed, here:
> (display
> (define-api-route /containers/json GET
> "application/x-www-form-urlencoded"))
This fails for the same reason that the following fails:
(display (define foo 1))
> While it was possible to have a define form inside a syntax-rules,
> suddenly it seems impossible inside a syntax-case?
For purposes of this issue, it is irrelevant whether the macro was
defined using syntax-rules or syntax-case.
If you have a macro that expands into a definition, then you can only
use that macro in a context where definitions are allowed.
Best,
Mark
o refer to
free software developers, or POSIX developers, or GNU/Linux developers,
or software developers in general?
It seems to me that most of the references to "Linux" are superfluous,
because almost all of this will work on any system that Guile supports.
What do you think?
Regards,
Mark
n "make uninstall" from the Guile 2.2.6 build
directory (if you still have it), then rerun "make install" from the
Guile 2.2.4 build directory, and finally "ldconfig" as root.
Best,
Mark
recall that we
reported the problem to the GDB developers at some point in the past.
Nowadays, most of the Guile developers seem to be using GNU Guix, where
'ldconfig' is never run, so we tend to forget about it.
Regards,
Mark
d*, instead of the environment where
(O) is used. In other words, in (let ((x 5)) (O)), the captured lexical
environment will not include 'x'.
I should also mention that using (the-environment) will pretty much
disable most compiler optimizations that would otherwise occur with that
top-level form. That entire mechanism is best avoided if at all
possible.
Can you tell me more broadly what you are trying to accomplish here?
I may be able to suggest an alternate approach.
Best,
Mark
mistake to try to parse code
within a macro's operands. It normally only makes sense for macros to
inspect the parts of operands that are considered part of the macro's
syntax. For example, it makes sense for a 'let' macro to parse its
binding list, or for a 'match' macro to parse its patterns and
templates, but it does *not* make sense for a macro to try to parse
general subexpressions passed to the macro.
If you could give me a birds-eye view of what you're trying to do here,
I might be able to suggest other approaches.
Best,
Mark
is what underlies the ,describe REPL command.
Best,
Mark
' might be a "wrapped
syntax object", but when the elements are extracted from it using the
'syntax-case' pattern (x ...) and then put back together using
#'(x ...), you can then assume that the resulting syntax object is
a normal Scheme list of syntax objects, and therefore it is safe to
use 'map' on it.
Mark
Hello all,
In light of recent events, I've decided to step back up as a
co-maintainer of GNU Guile.
Thanks,
Mark
the variable
that contained NULL.
In Scheme, the same issues apply. If there's at least one element in
the first list passed to 'append!', it can use 'set-cdr!' to modify the
last pair of the list. If the first argument is '(), it can't be done.
In practice, that's the reason why 'append!' is specified the way it is.
However, I would advise against assuming that 'append!' will always
modify the original list if it's nonempty, because that fact, although
true of the current implementation, is not actually specified.
Regards,
Mark
zx spectrumgomas writes:
> It's milk
> https://lists.gnu.org/archive/html/guile-devel/2019-10/msg00031.html
I'm sorry, but I don't understand what this means. If you are accusing
me of something, can you state your case clearly, without reference to
proverbs?
Mark
l, we must guard against Guile becoming a
one-man show if it can possibly be avoided. Keeping GNU strong means,
among other things, resolving our differences peacefully and working
together to make Guile better. That's what I intend to do.
I hope that clarifies things.
Thanks,
Mark
Ruby, and having to wrap your head around the
> REPL, debug, and stack code is too much to ask of any new Guiler.
For what it's worth, I think something like this would be a welcome
addition. However, my knowledge of the Guile debugger is currently
quite weak, so I'd prefer to hear from Andy before proceeding.
Thanks,
Mark
sion
about how to better communicate with one another, and Matrix was
identified as an option that would meet our requirements.
The client that would likely be most attractive for the younger
generation is Riot.im:
https://about.riot.im/
What do you think?
Thanks,
Mark
John Cowan writes:
> +1. If only it weren't GPL3, which makes it ineligible to be a SRFI
> implementation
Zelphir could propose a SRFI for the API only, with no reference
implementation. The existing implementation could remain copylefted.
Mark
copyleft licensing.
Personally, I don't think that SRFIs are important enough to justify
bowing to such pressure. Guile-JSON's association with Guile and Guix
is enough for it to gain wide adoption, whether it is a SRFI or not.
That said, it is of course Aleix's decision how to license his library.
Thanks,
Mark
as it's GPL-compatible. The X11 and Expat licenses are
both GPL-compatible. The ambiguous term "MIT license" usually refers to
one of those two licenses.
Mark
e, I used the word "pressure" in the sense of to "persuade" or to
"spur on, strongly recommend."
Therefore, I think I used the word correctly here.
Thanks,
Mark
elease their code as free software.
See <https://www.gnu.org/philosophy/pragmatic.html> for more.
Thanks,
Mark
not a GPLed JSON library requires the Scheme implementation
> to be itself GPL depends on the implementation, but certainly a
> stand-alone *application* that uses it would have to be.
Again, you are mistaken. Check your facts, please. See
<https://www.gnu.org/licenses/gpl-faq.html#WhatIsCompatible>.
Thanks,
Mark
f symbols. In fact, it
is a vector of lists of the form (quote ), for which '
is a shorthand.
scheme@(guile-user)> (vector-ref SQUARES 0)
$10 = (quote A1)
To fix the problem, remove all of the apostrophes (') from the elements
of the vector literal above. Like list literals, vector literals take
raw values, not expressions.
> (hash-ref SQUARES-TO-INTEGERS 'A1)
scheme@(guile-user)> (hash-ref SQUARES-TO-INTEGERS 'A1)
$11 = #f
scheme@(guile-user)> (hash-ref SQUARES-TO-INTEGERS ''A1)
$12 = 1
Mark
27;#(...). You can replace
the "'" with "`", just as you would for a quasiquoted list. For
example:
scheme@(guile-user)> `#(1 2 3)
$1 = #(1 2 3)
scheme@(guile-user)> `#(1 ,(+ 1 1) 3)
$2 = #(1 2 3)
scheme@(guile-user)> `#(1 (+ 1 1) 3)
$3 = #(1 (+ 1 1) 3)
Regards,
Mark
FF', 'FE', '41', '0', 'FF', 'FE', '42', '0', 'FF', 'FE', '43', '0']
>
> FFE is a little-endian Byte Order Mark (BOM), fine.
> But why is Guile adding it before every charact
e. I can't see a way to do that without
wrapping the whole set of expressions in `begin', but that's what
creates the problem I described above. I can hack a solution for now but
if anyone knows a clean way to do it, that'd be much appreciated.
Thanks,
--
Mark Witmer
work if you need to tell the difference between the
evaluation returning #f and an error happening. In that case, try this:
(catch #t
(lambda ()
(primitive-eval '(this is an error)))
(lambda (key . args)
(display "An error occurred during evaluation.\n")))
Happy hacking!
Mark
it from some envvar; later you'll be able to add a
W32-only implementation that does what i said earlier), and the other
makes guile use that prefix to construct paths it needs
If there are no objections to this approach, I'd be willing to work with
a Windows developer to make it happen.
Regards,
Mark
Hi Mark,
m...@markwitmer.com writes:
> I feel like it's time to announce Guile-WM, my stab at an all-Guile
> Window Manager. It's actually more of a toolkit for writing X
> applications, with the window manager stuff being what's implemented so
> far. It includes l
Hi Mark,
Sorry for taking so long to respond.
m...@markwitmer.com writes:
> Mark H Weaver writes:
>
>> m...@markwitmer.com writes:
>>> Reading and writing to a socket seems to lend itself well to custom
>>> binary ports,
>>
>> Why do you say that? Fo
Mark H Weaver writes:
> This all sounds very exciting! Enough so that I finally pulled
> guile-xcb and attempted to build it from git. Unfortunately, I ran into
> several problems:
Thanks for taking a look at it. I'll see if I can help:
>
> * Although the README says
Mark H Weaver writes:
>
> First of all, that '(close-port port)' is wrong. Here you are trying to
> tell Guile how to close 'port', and this just recurses. I guess it
> should be (close-port auth-file)'.
That's right. It's two bugs, actually---cl
x27; and Guile's 'main' (in libguile/guile.c) that
causes one to (apparently) initialize the stack base properly, where the
other fails? It would be worthwhile to find out.
Thanks,
Mark
mark.d.wit...@gmail.com writes:
> Mark H Weaver writes:
>
>> * Although the README says that Guile 2.0.9 is required, the configure
>> script will accept nothing less than Guile 2.2. Since 2.2 does not
>> exist yet, it would be good to accept Guile 2.0 in the meant
m...@markwitmer.com writes:
> Mark H Weaver writes:
>
>> Here's what happens on my Debian wheezy system, starting from a pristine
>> git checkout (using "git clean -dxf"):
>> ...
>> ice-9/boot-9.scm:106:20: In procedure #> ice-9/boot-9.scm:97:6 (t
Eli Zaretskii writes:
>> From: Mark H Weaver
>> Cc: Panicz Maciej Godek , guile-user@gnu.org
>> Date: Sun, 25 Aug 2013 12:59:43 -0400
>>
>> Eli Zaretskii writes:
>>
>> > I guess you didn't configure without threads on GNU/Linux, did you?
&g
Eli Zaretskii writes:
>> From: Mark H Weaver
>> Cc: Eli Zaretskii , "guile-user\@gnu.org"
>> Date: Fri, 23 Aug 2013 11:13:19 -0400
>>
>> Of course, ideally we would allow the entire Guile install to be freely
>> relocatable, as Windows users ha
Mark H Weaver writes:
> Eli Zaretskii writes:
>
>>> From: Mark H Weaver
>>> Cc: Eli Zaretskii , "guile-user\@gnu.org"
>>>
>>> Date: Fri, 23 Aug 2013 11:13:19 -0400
>>>
>>> Of course, ideally we would allow the entire Gui
l...@gnu.org (Ludovic Courtès) writes:
> Eli Zaretskii skribis:
>
>>> From: Mark H Weaver
>>> Cc: Eli Zaretskii , "guile-user\@gnu.org"
>>>
>>> Date: Fri, 23 Aug 2013 11:13:19 -0400
>>>
>>> Of course, ideally we would a
Eli Zaretskii writes:
>> From: Mark H Weaver
>> Cc: godek.mac...@gmail.com, guile-user@gnu.org
>> Date: Sun, 25 Aug 2013 15:56:53 -0400
>>
>> Remember that Guile is a library, not just an executable. So argv[0]
>> could point to any arbitrary executable
fferent version
> is installed on the system.
We already have a solution for this. Just run "meta/guile" from the
build directory, or more generally "meta/uninstalled-env".
>> From: Mark H Weaver
>> Cc: godek.mac...@gmail.com, guile-user@gnu.org
>
program can tell libguile where libguile is
located.
However, the only case where this API could reasonably be used is when
libguile is bundled with the program in question, because that's the
only case where the program would reliably know the location of the
libguile that the dynamic linker found.
Regards,
Mark
oad-path is the list '("./"
"/usr/share/guile/2.0" "/usr/share/guile/site/2.0"
"/usr/share/guile/site" "/usr/share/guile").
Could you send me yours and also the output of running make install for
Guile WM? I'd like to improve the build script so that it works for
everyone else and not just me!
Thanks for trying this out,
--
Mark Witmer
the
manual. You should also put a blank line before it, so that it's not
interpreted as the shebang at the top of a script.
Regards,
Mark
ing command?.
This is closest to what Emacs does, and probably the best solution, IMO. See
<https://www.gnu.org/software/emacs/manual/html_node/elisp/Interactive-Call.html>
which describes the 'commandp' predicate, whose definition is in eval.c.
Regards,
Mark
le")
scheme@(guile-user)> (use-modules (read-integers-from-file))
scheme@(guile-user)> (define lst (read-integers-from-file "rnd.txt"))
--8<---cut here---end--->8---
Note that although this code does partial error checking, it cann
.
Note that Guile 1.8 conflated characters and bytes, like many older
non-i18n programs, and thus effectively chose Latin-1 by default.
However, since most modern GNU systems use UTF-8 by default (at least
outside of the CJK world) this guess is most likely wrong, and thus
likely to silently corrupt non-ASCII characters.
Regards,
Mark
-8"))))
> This is really ridiculous.
You found a bug. It happens. There's no need to be obnoxious about it.
Mark
Mark H Weaver writes:
>> GET / HTTP/1.1
>> Content-Type: text/plain;charset=utf-8
>> Host: www.google.com
>> Connection: close
>
> I just applied a fix for this to the stable-2.0 branch in git. In the
> meantime, the workaround is to explicitly pass a content
Mark H Weaver writes:
>> (http-post "http://www.google.com/";)
>>
>> the POST request is sent without the Content-Length header
>
> RFC 2616 makes it clear that the Content-Length header is optional.
Sorry, I should have qualified this statement with "i
our limited
8-bit opcode space, and more code in the VM, which is bad because
ideally a VM should be compact for good cache behavior.
I think you should just use records, or maybe vectors, for this.
Mark
le could be compiled to a .go file,
and then this same module could be used by both threaded and unthreaded
versions of libguile.
Mark
Hi Mark,
Shortly after the releases of Guile XCB 1.1 and Guile WM 0.1, some
important problems were fixed in the build system. Would you be willing
to produce new tarball releases?
Several of us are interested in Guile WM and would like to make it
easier for new users to play with and hack on
Mark H Weaver writes:
> Hi Mark,
>
> Shortly after the releases of Guile XCB 1.1 and Guile WM 0.1, some
> important problems were fixed in the build system. Would you be willing
> to produce new tarball releases?
>
> Several of us are interested in Guile WM and would lik
mer.com/guile-xcb/guile-xcb.html
http://www.markwitmer.com/guile-xcb/guile-wm.html
I can't say that Guile-WM is as powerful and awesome as StumpWM
yet, but I think it's got lots of potential.
Thanks
--
Mark Witmer
are preserved. If more than N tail calls are done in a
row, then the older ones are forgotten.
Hopefully we'll have this for Guile some day.
Mark
fe. I hope to fix this in the next month or two, but for now
I'd recommend that one thread should initialize Guile and load the
modules that will be needed, before allowing multiple threads to enter
Guile mode.
Regards,
Mark
ds[2]. It's rather unusual to create fresh modules
for each thread, but if you really want to do that you can start each
thread by evaluating "(set-current-module (make-fresh-user-module))".
[1] API Reference > Scheduling > Parameters (section 6.21.8)
[2] API Reference > Scheduling > Fluids and Dynamic States (section 6.21.7)
Mark
Chris Vine writes:
> Unfortunately, from what Mark Weaver says, the module system doesn't
> initialize itself in a thread safe way either :(.
That's not quite right. It initializes itself in a thread safe way.
However, _after_ initialization, it does not load modules in a
Panicz Maciej Godek writes:
> 2014/1/5 Chris Vine :
>
>> I actually have a prototype working well now, apart from the module
>> issue Mark Weaver referred to, which I have to say has not yet bitten me
>> but no doubt might.
>
> If you are worried about this,
8. I see no other good solution.
Thoughts?
Mark
1 - 100 of 382 matches
Mail list logo