Re: Better way to write this function?

Liste des GroupesRevenir à cl lisp 
Sujet : Re: Better way to write this function?
De : Nobody447095 (at) *nospam* here-nor-there.org (B. Pym)
Groupes : comp.lang.lisp comp.lang.scheme
Date : 10. Sep 2024, 08:37:35
Autres entêtes
Organisation : A noiseless patient Spider
Message-ID : <vbopfd$2qrpe$1@dont-email.me>
User-Agent : XanaNews/1.18.1.6
Kenny Tilton wrote:

Peter Seibel wrote:
As part of a larger program I needed a function which given a number
(n) and a vector (row), returns the index into row of the n'th nil in
row. Here's the first (working) version I came up with:
>
  (defun nth-slot (n v)
    "Find the nth nil cell in a vector v."
    (loop with slots-seen = 0
          for item across v
          for idx from 0
          counting (not item) into slots-seen
          until (> slots-seen n)
          finally (if (> slots-seen n) (return idx) (error "No slot"))))
 
Please take that inscrutal glop to comp.lang.loop. <g>
 
(defun nth-null-slot-index (n v &optional must-find-p &aux (nil-ct 0))
    "Return the index of the nth nil cell in vector v"
    (dotimes (x (length v) (when must-find-p (error "bzzzt")))
       (when (null (elt v x))
          (when (= n (incf nil-ct)) ;; [1]
             (return-from nth-null-slot-index x)))))
 
(nth-null-slot-index 3 #(nil 1 2 nil 3 4 nil 5 nil nil))
=>6
 

The first nil found is considered to be number 1,
not number 0.

Gauche Scheme

(use gauche.generator)

;; "We don't need no stinkin' loops!"
(define (nth-null-slot-index n vec)
  (list-ref
    (generator->list
      ;; Gauche coerces the vector to a generator.
      (gselect (grange 0) (gmap not vec)))
    (- n 1)))


(nth-null-slot-index 3 #(#f a b #f c d #f e #f #f))
  ===>
6

Date Sujet#  Auteur
10 Sep 24 * Re: Better way to write this function?2B. Pym
10 Sep 24 `- Re: Better way to write this function?1B. Pym

Haut de la page

Les messages affichés proviennent d'usenet.

NewsPortal