[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Validating a Scheme list
From: |
Orm Finnendahl |
Subject: |
Re: Validating a Scheme list |
Date: |
Thu, 15 May 2014 10:41:15 +0200 |
User-agent: |
Mutt/1.5.21 (2010-09-15) |
Hi Urs,
it doesn't make too much sense to first collect the whole list and
then check for membership of #f. It'd be more reasonable to stop
iteration once any of the preconditions isn't met. You could achieve
this by using a recursive function like below (you could make it
more terse by using if instead of cond but in recursive functions cond
dispatch is more common and I find it more readable...):
#(define-scheme-function (parser location lst) (list?)
(letrec ((test (lambda (x)
(cond ((null? x) #t)
(#t (and (list? (car x))
(= (length (car x)) 2)
(test (cdr x))))))))
(if (test lst)
(display "invalid")
(display "valid"))
(newline)))
Am Donnerstag, den 15. Mai 2014 um 10:09:10 Uhr (+0200) schrieb Urs Liska:
> Hi all,
>
> I am working on a Scheme function and would like to check if I have found the
> best solution for a specific subpart. Somehow it looks more complicated than
> necessary.
>
> The function needs to test if each element of a given list is a (sub)list
> with exactly two elements. So
>
> '((1 2)(3 4))
>
> would return #t while
>
> '((5 6)(7 8 9))
>
> would return #f.
>
> My solution is
>
> \version "2.19.6"
>
> validate =
>
> #(define-scheme-function (parser location lst) (list?)
>
> (if (memv #f (map (lambda sig
>
> (and (list? (car sig))
>
> (= 2 (length (car sig))))) lst))
>
> (display "invalid")
>
> (display "valid"))
>
> (newline))
>
> {
>
> \validate #'((1 2)(3 4))
>
> \validate #'((5 6)(7 8 9))
>
> }
>
> The "framework" doesn't matter, it's just a compilable example. My question
> is only about the "if" expression.
>
> What it does is:
> - go through the elements of lst
> - produce a list of boolean values,
> - #t if we have a two element list,
> - #f if not
> - check if this intermediate list contains at least one #f
>
> Somehow this looks clumsy to me, and I'd like to know (and learn) if there's
> a better solution for this.
>
> TIA
> Urs
>
> _______________________________________________
> lilypond-user mailing list
> address@hidden
> https://lists.gnu.org/mailman/listinfo/lilypond-user