Deutsch English Français Italiano |
<20240913182544.67@kylheku.com> View for Bookmarking (what is this?) Look up another Usenet article |
Path: ...!2.eu.feeder.erje.net!feeder.erje.net!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: Kaz Kylheku <643-408-1753@kylheku.com> Newsgroups: comp.lang.lisp,comp.lang.scheme Subject: Re: case and quoted keys - a misunderstanding Date: Sat, 14 Sep 2024 16:38:54 -0000 (UTC) Organization: A noiseless patient Spider Lines: 77 Message-ID: <20240913182544.67@kylheku.com> References: <vc2g56$12ukb$1@dont-email.me> Injection-Date: Sat, 14 Sep 2024 18:38:54 +0200 (CEST) Injection-Info: dont-email.me; posting-host="70215a4d804215b5dfff445270e300c7"; logging-data="1658795"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX19XH7my1w0vftVH/jzWa3/CPf4uY8NM5A0=" User-Agent: slrn/pre1.0.4-9 (Linux) Cancel-Lock: sha1:V7vv75Mjt5G4AQp5l9QkBRHtztQ= Bytes: 2848 On 2024-09-13, B. Pym <Nobody447095@here-nor-there.org> wrote: > Frode Vatvedt Fjeld wrote: > >> > (defun read-to-char (c stream) >> > (let ((x (read-char stream nil))) >> > (cond ((null x) nil) >> > ((char= x c) t) >> > (t (read-to-char c stream))))) >> > >> > This isn't much worse looking then the obvious iterative solutions. >> >> ..only it has Scheme written all over it ;-) In Common Lisp this is >> spelled as >> >> (defun read-to-char (c stream) >> (loop for x = (read-char stream nil) >> while x do (when (char= x c) (return t)))) > > It's shorter in Gauche Scheme: > > (use srfi-42) ;; first-ec > > (define (read-to-char c port) > (first-ec #f > (:port x port read-char) > (if (char=? x c)) > #t)) > > Testing. > > (call-with-input-string "foo-Frodo is foolish." > (lambda (in) (read-to-char #\- in) > (read-line in))) > ===> > "Frodo is foolish." > > Shorter yet: What, that is longer? > (use srfi-121) ; generators > > (define (read-to-char c port) > (generator-find (is c) (cut read-char port))) > > Given: > > (define-syntax is > (syntax-rules () > [(is x) > (lambda (y) (equal? y x))] > [(is compare x) > (lambda (y) (compare y x))] > [(is key compare x) > (lambda (y) (compare (key y) x))])) The "Given:" has to count as part of the length of the solution. Otherwiwse, we can just say: " Shorter yet: ;; nothing Given: (define (read-to-char c port) ...) " If you can factor out any aspect of your solution into macros and functions which don't count toward its size, then you just do that with the function you are supposed to write, and the solution has zero size. -- TXR Programming Language: http://nongnu.org/txr Cygnal: Cygwin Native Application Library: http://kylheku.com/cygnal Mastodon: @Kazinator@mstdn.ca