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:λ