Path: ...!feeds.phibee-telecom.net!news.mixmin.net!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!.POSTED!not-for-mail From: "B. Pym" Newsgroups: comp.lang.lisp,comp.lang.scheme Subject: Re: Learning Lisp in Linux? Date: Wed, 28 Aug 2024 00:49:14 -0000 (UTC) Organization: A noiseless patient Spider Lines: 37 Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Injection-Date: Wed, 28 Aug 2024 02:49:14 +0200 (CEST) Injection-Info: dont-email.me; posting-host="e20b841b07463d489f1974339e45f851"; logging-data="3356558"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1/Qanw5bF3MS+3USo3OiBOn" User-Agent: XanaNews/1.18.1.6 Cancel-Lock: sha1:e91LJSMPg9DJlIcrJ01MNxywpZs= Bytes: 1950 Pascal Costanza wrote: > > I'm not advocating tail-recursion instead of specialized iteration > > mechanisms closer to the problem domain. I'm just saying tail- > > recursion code isn't anywhere as low-level as you're making it up to > > be. > > It actually is, and your posting below shows it very nicely. > > >> Here is a nice example using loop: > >> > >> (loop for (key value) on property-list by #'cddr > >> unless (member key excluded-keys) > >> append (list key value)) ; [1] > > As a function: > > (defun filter (excluded-keys property-list) > (loop for (key value) on property-list by #'cddr > unless (member key excluded-keys) > nconc (list key value))) > > > (filter '(c d) '(a 1 b 2 b 3 c 4 d 5 c 6)) > (A 1 B 2 B 3) > > The result is a correct property list Gauche Scheme (define (remove-props bad-keys prop-list) (concatenate (remove (^p (member (car p) bad-keys)) (slices prop-list 2)))) (remove-props '(c d) '(a 1 b 2 b 3 c 4 d 5 c 6)) ===> (a 1 b 2 b 3)