Skip to content

GitLab

  • Projects
  • Groups
  • Snippets
  • Help
    • Loading...
  • Help
    • Help
    • Support
    • Community forum
    • Submit feedback
    • Contribute to GitLab
  • Sign in / Register
I
iterate
  • Project overview
    • Project overview
    • Details
    • Activity
    • Releases
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
  • Issues 7
    • Issues 7
    • List
    • Boards
    • Labels
    • Service Desk
    • Milestones
  • Merge Requests 2
    • Merge Requests 2
  • CI / CD
    • CI / CD
    • Pipelines
    • Jobs
    • Schedules
  • Operations
    • Operations
    • Incidents
    • Environments
  • Packages & Registries
    • Packages & Registries
    • Container Registry
  • Analytics
    • Analytics
    • CI / CD
    • Repository
    • Value Stream
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Members
    • Members
  • Activity
  • Graph
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
Collapse sidebar
  • iterate
  • iterate
  • Merge Requests
  • !2

Open
Opened Nov 29, 2019 by Steve Losh@sjl
  • Report abuse
Report abuse

Fix control flow when the loop contains NIL blocks

  • Overview 1
  • Commits 1
  • Changes 2

Control flow clauses that return from an iterate form without executing the epilogue code (e.g. never and leave) currently do so by expanding into (return-from ,*block-name*). For iterate forms without a user-provided name, the block will be named nil. This causes problems when used with other Common Lisp looping constructs such as dolist:

(iterate
  (for i :from 0 :below 10)
  (dolist (x '(5 10 15))
    (never (= i x))))
; => T, but should be NIL

This patch adds a separate *loop-name* variable that will be bound to a gensym for NIL-named blocks and makes the various epilogue-skipping code refer to that instead of *block-name*. Iterate forms without an explicit user-provided name will still have a separate (block nil ...) wrapping so users can still (return ...) as before.

Before (simplified):

(iterate (leave))
; ==> (block nil (return-from nil))

(iterate foo (leave))
; ==> (block foo (return-from nil))

After:

(iterate (leave))
; ==> (block nil (block #:ITERATE123 (return-from #:ITERATE123)))

(iterate foo (leave))
; ==> (block foo (return-from foo))
Assignee
Assign to
Reviewer
Request review from
None
Milestone
None
Assign milestone
Time tracking
Reference: iterate/iterate!2
Source branch: fix-nil-block-returns