packages feed

phino-0.0.162: test-resources/evaluate-packs/joins-a-side-that-dispatches-on-a-terminator.yaml

# SPDX-FileCopyrightText: Copyright (c) 2025 Objectionary.com
# SPDX-License-Identifier: MIT
---
# yamllint disable rule:line-length
# The right side takes 'q' of a copy of 'throw', whose λ function 'L_throw'
# the entry names under 'terminators'. A dispatch on something that raises
# is the same raise, so the morph of the side stops at the copy of 'throw'
# and never fires 'L_throw', and the join takes it for a side that raises,
# the way it does without the '.q' (#2308).
symbolic: |
  - λ: L_fork
    terminators: [L_throw]
    dataize:
      𝛿1: $.on🌵
    morph:
      𝑛1: $.left🌵
      𝑛2: $.right🌵
    join:
      on: 𝛿1
      left: 𝑛1
      right: 𝑛2
      otherwise: L_fork
location: 'Q.x'
input: '⟦ throw(message) ↦ ⟦ λ ⤍ L_throw ⟧, x ↦ ⟦ λ ⤍ L_fork, on🌵 ↦ ⟦ λ ⤍ 𝜎1 ⟧, left🌵 ↦ ⟦ k ↦ ⟦⟧, φ ↦ ⟦ λ ⤍ 𝜎2 ⟧ ⟧, right🌵 ↦ Φ.throw( "bad" ).q ⟧.φ ⟧'
result: '𝜎4:λ'
protocol: |
  𝕄(Φ.x):
    𝔼(L_fork):
      𝔻(ξ.on🌵):
        𝛿·1·1 := 𝔻(𝜎1:λ)
      𝛿1·1 := 𝛿·1·1  # 𝔻(ξ.on🌵)
      𝕄(ξ.left🌵):
        morphed 𝑛·1·1 := ⟦ k ↦ ⟦⟧, φ ↦ 𝜎2:λ ⟧
      𝑛1·1 := 𝑛·1·1  # 𝕄(ξ.left🌵)
      𝕄(ξ.right🌵):
        remembered 𝑛·1·2 ≡ Φ.throw  # ⟦ message ↦ ∅, λ ⤍ L_throw ⟧
        𝑛·1·3 := Φ.throw( message ↦ "bad" )
        𝑛·1·4 := ⟦ message ↦ "bad", λ ⤍ L_throw ⟧
        remembered 𝑛·1·4 ≡ 𝑛·1·2( message ↦ "bad" )
        morphed 𝑛·1·5 := 𝑛·1·4
      𝑛2·1 := 𝑛·1·4  # 𝕄(ξ.right🌵)
      joined 𝜎4 := 𝛿1·1 ? 𝜎2 : 𝜎3  # where 𝜎3 is ⊥ raised by 𝑛·1·4
      𝑛·1·6 := ⟦ k ↦ ⟦⟧, φ ↦ 𝜎4:λ ⟧
    morphed 𝑛·0·1 := 𝜎4:λ