diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EObool$EOif.java b/eo-runtime/src/main/java/EOorg/EOeolang/EObool$EOif.java index 75f1d3e216..539fe2ae52 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EObool$EOif.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EObool$EOif.java @@ -27,7 +27,6 @@ */ package EOorg.EOeolang; -import org.eolang.AtLambda; import org.eolang.AtFree; import org.eolang.AtLambda; import org.eolang.Attr; diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EObool$EOwhile.java b/eo-runtime/src/main/java/EOorg/EOeolang/EObool$EOwhile.java index d8c9f0c6cb..2c6ff5184c 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EObool$EOwhile.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EObool$EOwhile.java @@ -62,7 +62,10 @@ public class EObool$EOwhile extends PhDefault { rho -> { Phi last = new Data.ToPhi(false); long count = 0L; - while (new Param(rho).strong(Boolean.class)) { + while (true) { + if (!new Param(rho).strong(Boolean.class)) { + break; + } new Dataized(last).take(); last = rho.attr("f").get().copy(); last.attr("ρ").put(rho); diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EObytes$EOsize.java b/eo-runtime/src/main/java/EOorg/EOeolang/EObytes$EOsize.java index 07843564d4..1e1f325746 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EObytes$EOsize.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EObytes$EOsize.java @@ -27,7 +27,6 @@ */ package EOorg.EOeolang; -import org.eolang.AtLambda; import org.eolang.AtLambda; import org.eolang.Attr; import org.eolang.Data; diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EObytes$EOslice.java b/eo-runtime/src/main/java/EOorg/EOeolang/EObytes$EOslice.java index 13d0fe6a4b..887594736a 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EObytes$EOslice.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EObytes$EOslice.java @@ -28,8 +28,8 @@ package EOorg.EOeolang; import java.util.Arrays; -import org.eolang.AtLambda; import org.eolang.AtFree; +import org.eolang.AtLambda; import org.eolang.Attr; import org.eolang.Data; import org.eolang.Param; diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EObytes$EOxor.java b/eo-runtime/src/main/java/EOorg/EOeolang/EObytes$EOxor.java index 0075035227..0c19638242 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EObytes$EOxor.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EObytes$EOxor.java @@ -27,8 +27,8 @@ */ package EOorg.EOeolang; -import org.eolang.AtLambda; import org.eolang.AtFree; +import org.eolang.AtLambda; import org.eolang.AtVararg; import org.eolang.Attr; import org.eolang.Bytes; diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOcage.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOcage.java index 9a5eb9831d..c4b8b7e48b 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EOcage.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOcage.java @@ -27,11 +27,10 @@ */ package EOorg.EOeolang; +import org.eolang.AtAtom; import org.eolang.AtCage; -import org.eolang.AtLambda; import org.eolang.AtFree; -import org.eolang.AtOnce; -import org.eolang.AtSimple; +import org.eolang.AtLambda; import org.eolang.Attr; import org.eolang.Data; import org.eolang.PhDefault; @@ -59,7 +58,27 @@ public EOcage(final Phi sigma) { super(sigma); this.add("enclosure", new AtCage()); this.add(Attr.LAMBDA, new AtLambda(this, rho -> rho.attr("enclosure").get())); - this.add("write", new AtOnce(new AtSimple(new EOcage.Write(this)))); + this.add("write", new AtWrite(this)); + } + + /** + * Cage.write attribute. + * @since 0.33.0 + */ + private static final class AtWrite extends AtAtom { + + /** + * Ctor. + * @param cage The {@link EOcage} object + */ + AtWrite(final Phi cage) { + super(new EOcage.Write(cage)); + } + + @Override + public Attr copy(final Phi self) { + return new AtWrite(self); + } } /** diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOerror.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOerror.java index 5c32da00ca..c8cb3cbda7 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EOerror.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOerror.java @@ -27,8 +27,8 @@ */ package EOorg.EOeolang; -import org.eolang.AtLambda; import org.eolang.AtFree; +import org.eolang.AtLambda; import org.eolang.Attr; import org.eolang.ExAbstract; import org.eolang.ExFailure; diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOfloat$EOdiv.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOfloat$EOdiv.java index 37c5e3c87f..b637202e56 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EOfloat$EOdiv.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOfloat$EOdiv.java @@ -27,8 +27,8 @@ */ package EOorg.EOeolang; -import org.eolang.AtLambda; import org.eolang.AtFree; +import org.eolang.AtLambda; import org.eolang.Attr; import org.eolang.Data; import org.eolang.Param; diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOfloat$EOgt.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOfloat$EOgt.java index 2afff581e1..67ad98e533 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EOfloat$EOgt.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOfloat$EOgt.java @@ -27,8 +27,8 @@ */ package EOorg.EOeolang; -import org.eolang.AtLambda; import org.eolang.AtFree; +import org.eolang.AtLambda; import org.eolang.Attr; import org.eolang.Data; import org.eolang.Param; diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOfloat$EOplus.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOfloat$EOplus.java index f624ebb1f8..ba13d0f248 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EOfloat$EOplus.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOfloat$EOplus.java @@ -27,8 +27,8 @@ */ package EOorg.EOeolang; -import org.eolang.AtLambda; import org.eolang.AtFree; +import org.eolang.AtLambda; import org.eolang.Attr; import org.eolang.Data; import org.eolang.Param; diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOfloat$EOtimes.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOfloat$EOtimes.java index 88bc7f8470..71267a4db5 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EOfloat$EOtimes.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOfloat$EOtimes.java @@ -27,8 +27,8 @@ */ package EOorg.EOeolang; -import org.eolang.AtLambda; import org.eolang.AtFree; +import org.eolang.AtLambda; import org.eolang.Attr; import org.eolang.Data; import org.eolang.Param; diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOgoto.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOgoto.java index 7ab16983cf..a5bd48d4f8 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EOgoto.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOgoto.java @@ -27,8 +27,10 @@ */ package EOorg.EOeolang; -import org.eolang.AtLambda; +import org.eolang.AtAtom; import org.eolang.AtFree; +import org.eolang.AtLambda; +import org.eolang.Attr; import org.eolang.Dataized; import org.eolang.ExAbstract; import org.eolang.PhDefault; @@ -90,15 +92,54 @@ public EOgoto(final Phi sigma) { * @since 0.17 */ @XmirObject(oname = "goto.token") - private final class Token extends PhDefault { + private static final class Token extends PhDefault { /** * Ctor. * @param sigma Sigma */ Token(final Phi sigma) { super(sigma); - this.add("backward", new AtComposite(this, EOgoto.Backward::new)); - this.add("forward", new AtComposite(this, EOgoto.Forward::new)); + this.add("backward", new EOgoto.Token.AtBackward(this)); + this.add("forward", new EOgoto.Token.AtForward(this)); + } + + /** + * Goto.token.forward attribute. + * @since 0.33.0 + */ + private static final class AtForward extends AtAtom { + + /** + * Ctor. + * @param token The {@link EOgoto.Token} object + */ + AtForward(final Phi token) { + super(new EOgoto.Forward(token)); + } + + @Override + public Attr copy(final Phi self) { + return new AtForward(self); + } + } + + /** + * Goto.token.backward attribute. + * @since 0.33.0 + */ + private static final class AtBackward extends AtAtom { + /** + * Ctor. + * @param token The {@link EOgoto.Token} object + */ + AtBackward(final Phi token) { + super(new EOgoto.Backward(token)); + } + + @Override + public Attr copy(final Phi self) { + return new AtBackward(self); + } } } @@ -107,7 +148,7 @@ private final class Token extends PhDefault { * @since 0.17 */ @XmirObject(oname = "goto.token.backward") - private final class Backward extends PhDefault { + private static final class Backward extends PhDefault { /** * Ctor. * @param sigma Sigma @@ -115,8 +156,8 @@ private final class Backward extends PhDefault { Backward(final Phi sigma) { super(sigma); this.add( - "φ", - new AtComposite( + Attr.LAMBDA, + new AtLambda( this, rho -> { throw new EOgoto.BackwardException( @@ -133,7 +174,7 @@ private final class Backward extends PhDefault { * @since 0.17 */ @XmirObject(oname = "goto.token.forward") - private final class Forward extends PhDefault { + private static final class Forward extends PhDefault { /** * Ctor. * @param sigma Sigma @@ -142,8 +183,8 @@ private final class Forward extends PhDefault { super(sigma); this.add("ret", new AtFree()); this.add( - "φ", - new AtComposite( + Attr.LAMBDA, + new AtLambda( this, rho -> { throw new EOgoto.ForwardException( diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOheap$EOpointer$EOblock.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOheap$EOpointer$EOblock.java index ea7fe13e02..b67f9b40f6 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EOheap$EOpointer$EOblock.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOheap$EOpointer$EOblock.java @@ -28,8 +28,10 @@ package EOorg.EOeolang; import java.util.Arrays; -import org.eolang.AtLambda; +import org.eolang.AtAtom; import org.eolang.AtFree; +import org.eolang.AtLambda; +import org.eolang.Attr; import org.eolang.Data; import org.eolang.Param; import org.eolang.PhDefault; @@ -56,7 +58,7 @@ public class EOheap$EOpointer$EOblock extends PhDefault { super(sigma); this.add("len", new AtFree()); this.add("inverse", new AtFree()); - this.add("write", new AtComposite(this, EOheap$EOpointer$EOblock.Write::new)); + this.add("write", new AtWrite(this)); this.add( Attr.LAMBDA, new AtLambda( @@ -78,12 +80,31 @@ public class EOheap$EOpointer$EOblock extends PhDefault { ); } + /** + * Head.pointer.block.write attribute. + * @since 0.33.0 + */ + private static final class AtWrite extends AtAtom { + /** + * Ctor. + * @param block The {@link EOheap$EOpointer$EOblock} object + */ + AtWrite(final Phi block) { + super(new EOheap$EOpointer$EOblock.Write(block)); + } + + @Override + public Attr copy(final Phi self) { + return new AtWrite(self); + } + } + /** * Write block. * @since 0.19 */ @XmirObject(oname = "heap.pointer.block.write") - private final class Write extends PhDefault { + private static final class Write extends PhDefault { /** * Ctor. * @param sigma Sigma @@ -92,8 +113,8 @@ private final class Write extends PhDefault { super(sigma); this.add("x", new AtFree()); this.add( - "φ", - new AtComposite( + Attr.LAMBDA, + new AtLambda( this, rho -> { final Phi block = rho.attr("σ").get(); diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOint$EOdiv.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOint$EOdiv.java index d7550644c8..11aed96024 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EOint$EOdiv.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOint$EOdiv.java @@ -27,8 +27,8 @@ */ package EOorg.EOeolang; -import org.eolang.AtLambda; import org.eolang.AtFree; +import org.eolang.AtLambda; import org.eolang.Attr; import org.eolang.Data; import org.eolang.ExFailure; diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOint$EOgt.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOint$EOgt.java index 21f6dd9dd2..3b3144d7b0 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EOint$EOgt.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOint$EOgt.java @@ -27,8 +27,8 @@ */ package EOorg.EOeolang; -import org.eolang.AtLambda; import org.eolang.AtFree; +import org.eolang.AtLambda; import org.eolang.Attr; import org.eolang.Data; import org.eolang.Param; diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOint$EOplus.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOint$EOplus.java index ace74b2f6b..f81a4f9d99 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EOint$EOplus.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOint$EOplus.java @@ -27,8 +27,8 @@ */ package EOorg.EOeolang; -import org.eolang.AtLambda; import org.eolang.AtFree; +import org.eolang.AtLambda; import org.eolang.Attr; import org.eolang.Data; import org.eolang.Param; diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOint$EOtimes.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOint$EOtimes.java index b27daf7e3b..023e16a080 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EOint$EOtimes.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOint$EOtimes.java @@ -27,8 +27,8 @@ */ package EOorg.EOeolang; -import org.eolang.AtLambda; import org.eolang.AtFree; +import org.eolang.AtLambda; import org.eolang.Attr; import org.eolang.Data; import org.eolang.Param; diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOio/EOstdout.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOio/EOstdout.java index 1f39352bf7..e06b73d113 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EOio/EOstdout.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOio/EOstdout.java @@ -28,8 +28,8 @@ package EOorg.EOeolang.EOio; import java.io.PrintStream; -import org.eolang.AtLambda; import org.eolang.AtFree; +import org.eolang.AtLambda; import org.eolang.Attr; import org.eolang.Data; import org.eolang.Param; diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOmemory.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOmemory.java index ab8b786f39..4f56872afe 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EOmemory.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOmemory.java @@ -27,10 +27,9 @@ */ package EOorg.EOeolang; -import org.eolang.AtLambda; +import org.eolang.AtAtom; import org.eolang.AtFree; -import org.eolang.AtOnce; -import org.eolang.AtSimple; +import org.eolang.AtLambda; import org.eolang.Attr; import org.eolang.PhDefault; import org.eolang.Phi; @@ -55,7 +54,26 @@ public EOmemory(final Phi sigma) { super(sigma); this.add("enclosure", new AtMemoized()); this.add(Attr.LAMBDA, new AtLambda(this, rho -> rho.attr("enclosure").get())); - this.add("write", new AtOnce(new AtSimple(new EOmemory.Write(this)))); + this.add("write", new EOmemory.AtMemoryWrite(this)); + } + + /** + * Memory.write attribute. + * @since 0.33.0 + */ + private static final class AtMemoryWrite extends AtAtom { + /** + * Ctor. + * @param memory The {@link EOmemory} object + */ + AtMemoryWrite(final Phi memory) { + super(new EOmemory.Write(memory)); + } + + @Override + public Attr copy(final Phi self) { + return new AtMemoryWrite(self); + } } /** diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOram$EOram_slice$EOwrite.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOram$EOram_slice$EOwrite.java index b7aeb5b190..86b9497295 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EOram$EOram_slice$EOwrite.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOram$EOram_slice$EOwrite.java @@ -27,8 +27,8 @@ */ package EOorg.EOeolang; -import org.eolang.AtLambda; import org.eolang.AtFree; +import org.eolang.AtLambda; import org.eolang.Attr; import org.eolang.Data; import org.eolang.Param; diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOram$EOslice.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOram$EOslice.java index bbee5a9fe7..6af839b04e 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EOram$EOslice.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOram$EOslice.java @@ -27,8 +27,8 @@ */ package EOorg.EOeolang; -import org.eolang.AtLambda; import org.eolang.AtFree; +import org.eolang.AtLambda; import org.eolang.Attr; import org.eolang.Data; import org.eolang.Param; diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOram$EOwrite.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOram$EOwrite.java index 5b4bb32d50..1744128a6d 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EOram$EOwrite.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOram$EOwrite.java @@ -27,8 +27,8 @@ */ package EOorg.EOeolang; -import org.eolang.AtLambda; import org.eolang.AtFree; +import org.eolang.AtLambda; import org.eolang.Attr; import org.eolang.Data; import org.eolang.Param; diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOrust.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOrust.java index fc152bc18b..8a1304c82c 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EOrust.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOrust.java @@ -47,8 +47,8 @@ import org.cactoos.bytes.BytesOf; import org.cactoos.bytes.IoCheckedBytes; import org.cactoos.text.TextOf; -import org.eolang.AtLambda; import org.eolang.AtFree; +import org.eolang.AtLambda; import org.eolang.Attr; import org.eolang.Data; import org.eolang.ExFailure; diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOstring$EOslice.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOstring$EOslice.java index 83a1b81619..871f5cf41f 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EOstring$EOslice.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOstring$EOslice.java @@ -27,8 +27,8 @@ */ package EOorg.EOeolang; -import org.eolang.AtLambda; import org.eolang.AtFree; +import org.eolang.AtLambda; import org.eolang.Attr; import org.eolang.Data; import org.eolang.ExFailure; diff --git a/eo-runtime/src/main/java/EOorg/EOeolang/EOtry.java b/eo-runtime/src/main/java/EOorg/EOeolang/EOtry.java index cf02be6abe..e14730f0dc 100644 --- a/eo-runtime/src/main/java/EOorg/EOeolang/EOtry.java +++ b/eo-runtime/src/main/java/EOorg/EOeolang/EOtry.java @@ -27,8 +27,8 @@ */ package EOorg.EOeolang; -import org.eolang.AtLambda; import org.eolang.AtFree; +import org.eolang.AtLambda; import org.eolang.Attr; import org.eolang.Dataized; import org.eolang.PhDefault; diff --git a/eo-runtime/src/main/java/org/eolang/AtAtom.java b/eo-runtime/src/main/java/org/eolang/AtAtom.java new file mode 100644 index 0000000000..1613fb2a22 --- /dev/null +++ b/eo-runtime/src/main/java/org/eolang/AtAtom.java @@ -0,0 +1,78 @@ +/* + * The MIT License (MIT) + * + * Copyright (c) 2016-2023 Objectionary.com + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package org.eolang; + +/** + * Attribute for inner atoms. + * @since 0.33.0 + * @checkstyle DesignForExtensionCheck (100 lines) + */ +public abstract class AtAtom implements Attr { + /** + * Original attribute. + */ + private final Attr origin; + + /** + * Ctor. + * @param phi Phi to wrap. + */ + public AtAtom(final Phi phi) { + this(new AtSimple(phi)); + } + + /** + * Ctor. + * @param attr Attribute to wrap. + */ + AtAtom(final Attr attr) { + this.origin = new AtOnce(attr); + } + + @Override + public Attr copy(final Phi self) { + return this.origin.copy(self); + } + + @Override + public String φTerm() { + return this.origin.φTerm(); + } + + @Override + public String toString() { + return this.origin.toString(); + } + + @Override + public Phi get() { + return this.origin.get(); + } + + @Override + public void put(final Phi phi) { + this.origin.put(phi); + } +} diff --git a/eo-runtime/src/main/java/org/eolang/AtComposite.java b/eo-runtime/src/main/java/org/eolang/AtComposite.java index f3dc0b7e0b..5d4a983e4a 100644 --- a/eo-runtime/src/main/java/org/eolang/AtComposite.java +++ b/eo-runtime/src/main/java/org/eolang/AtComposite.java @@ -37,16 +37,10 @@ */ @Versionized public final class AtComposite implements Attr { - /** - * The \rho to send to the expression. + * Original attribute. */ - private final Phi rho; - - /** - * The expression itself. - */ - private final Expr expr; + private final Attr origin; /** * Ctor. @@ -54,51 +48,39 @@ public final class AtComposite implements Attr { * @param exp The expression */ public AtComposite(final Phi obj, final Expr exp) { - this.rho = obj; - this.expr = exp; + this(new AtLambda(obj, exp)); + } + + /** + * Ctor. + * @param attr Attribute. + */ + AtComposite(final Attr attr) { + this.origin = attr; } @Override public String toString() { - return "λ"; + return this.origin.toString(); } @Override public String φTerm() { - return "λ"; + return this.origin.φTerm(); } @Override public Attr copy(final Phi self) { - return new AtComposite(self, this.expr); + return new AtComposite(this.origin.copy(self)); } @Override public Phi get() { - try { - return this.expr.get(this.rho); - } catch (final InterruptedException ex) { - Thread.currentThread().interrupt(); - throw new ExInterrupted(); - // @checkstyle IllegalCatchCheck (3 line) - } catch (final RuntimeException ex) { - throw ex; - } catch (final Throwable ex) { - throw new ExFailure( - String.format( - "Unexpected error '%s' of type %s", - ex.getMessage(), - ex.getClass().getSimpleName() - ), - ex - ); - } + return this.origin.get(); } @Override public void put(final Phi phi) { - throw new ExReadOnly( - "You can't overwrite static expression" - ); + this.origin.put(phi); } } diff --git a/eo-runtime/src/main/java/org/eolang/AtLambda.java b/eo-runtime/src/main/java/org/eolang/AtLambda.java index 6a64728c5a..84a869d772 100644 --- a/eo-runtime/src/main/java/org/eolang/AtLambda.java +++ b/eo-runtime/src/main/java/org/eolang/AtLambda.java @@ -92,7 +92,7 @@ public Phi get() { @Override public void put(final Phi phi) { throw new ExReadOnly( - "You can't overwrite labmda expression" + "You can't overwrite lambda expression" ); } } diff --git a/eo-runtime/src/main/java/org/eolang/AtSimple.java b/eo-runtime/src/main/java/org/eolang/AtSimple.java index 4cbe62c3f3..f2846ba476 100644 --- a/eo-runtime/src/main/java/org/eolang/AtSimple.java +++ b/eo-runtime/src/main/java/org/eolang/AtSimple.java @@ -78,5 +78,4 @@ public Phi get() { public void put(final Phi src) { this.phi = src; } - } diff --git a/eo-runtime/src/main/java/org/eolang/Attr.java b/eo-runtime/src/main/java/org/eolang/Attr.java index 916ef2f7dd..5ed33f9385 100644 --- a/eo-runtime/src/main/java/org/eolang/Attr.java +++ b/eo-runtime/src/main/java/org/eolang/Attr.java @@ -36,6 +36,11 @@ public interface Attr extends Term { */ String LAMBDA = "λ"; + /** + * Phi attribute. + */ + String PHI = "φ"; + /** * Make a copy of it. * diff --git a/eo-runtime/src/main/java/org/eolang/PhDefault.java b/eo-runtime/src/main/java/org/eolang/PhDefault.java index 85a52d5433..9b87a87187 100644 --- a/eo-runtime/src/main/java/org/eolang/PhDefault.java +++ b/eo-runtime/src/main/java/org/eolang/PhDefault.java @@ -249,14 +249,21 @@ public final Attr attr(final String name) { attr = this.attrs.get(name); } if (null == attr) { - final Attr aphi = this.attrs.get("φ"); + final String through; + if (this.attrs.containsKey(Attr.PHI)) { + through = Attr.PHI; + } else { + through = Attr.LAMBDA; + } + final Attr aphi = this.attrs.get(through); if (null == aphi) { attr = new AtAbsent( name, String.format( - " among other %d attrs (%s) and φ is absent", + " among other %d attrs (%s) and %s is absent", this.attrs.size(), - String.join(", ", this.attrs.keySet()) + String.join(", ", this.attrs.keySet()), + through ) ); } else { @@ -267,7 +274,7 @@ public final Attr attr(final String name) { } } attr = this.named(attr, name); - if ("φ".equals(name)) { + if (Attr.PHI.equals(name)) { attr = new AtPhiSensitive(attr, this.cached); } if (this.getClass().isAnnotationPresent(Volatile.class)) { diff --git a/eo-runtime/src/test/eo/org/eolang/cage-tests.eo b/eo-runtime/src/test/eo/org/eolang/cage-tests.eo index 62f55b4900..d1b18e1f81 100644 --- a/eo-runtime/src/test/eo/org/eolang/cage-tests.eo +++ b/eo-runtime/src/test/eo/org/eolang/cage-tests.eo @@ -106,10 +106,9 @@ eq. > @ seq cage > c - [x] + [] 112 > @ c.@ - 42 112 [] > multi-layer-volatility diff --git a/eo-runtime/src/test/java/EOorg/EOeolang/EOboolEOwhileTest.java b/eo-runtime/src/test/java/EOorg/EOeolang/EOboolEOwhileTest.java index b73d878c4b..c02e9b2ee3 100644 --- a/eo-runtime/src/test/java/EOorg/EOeolang/EOboolEOwhileTest.java +++ b/eo-runtime/src/test/java/EOorg/EOeolang/EOboolEOwhileTest.java @@ -41,7 +41,6 @@ import org.eolang.Phi; import org.hamcrest.MatcherAssert; import org.hamcrest.Matchers; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; /** @@ -135,7 +134,9 @@ void dataizesComplexBooleanToggle() { final Phi toggle = new PhMethod(new Parent(Phi.Φ), "toggle"); new Dataized( new PhWith( - new PhMethod(toggle, "write"), + new PhCopy( + new PhMethod(toggle, "write") + ), 0, new Data.ToPhi(true) ) ).take(); @@ -203,7 +204,9 @@ private static final class Kid extends PhDefault { rho -> { new Dataized( new PhWith( - new PhMethod(this.toggle, "write"), + new PhCopy( + new PhMethod(this.toggle, "write") + ), 0, new Data.ToPhi(false) ) diff --git a/eo-runtime/src/test/java/org/eolang/AtCompositeTest.java b/eo-runtime/src/test/java/org/eolang/AtLambdaTest.java similarity index 90% rename from eo-runtime/src/test/java/org/eolang/AtCompositeTest.java rename to eo-runtime/src/test/java/org/eolang/AtLambdaTest.java index 997d83fc8f..dc35253631 100644 --- a/eo-runtime/src/test/java/org/eolang/AtCompositeTest.java +++ b/eo-runtime/src/test/java/org/eolang/AtLambdaTest.java @@ -30,17 +30,17 @@ import org.junit.jupiter.api.Test; /** - * Test case for {@link AtComposite}. + * Test case for {@link AtLambda}. * * @since 0.16 */ -final class AtCompositeTest { +final class AtLambdaTest { @Test void decoratesCheckedException() { Assertions.assertThrows( ExFailure.class, - () -> new AtComposite( + () -> new AtLambda( Phi.Φ, self -> { throw new InstantiationException("intended checked"); @@ -53,7 +53,7 @@ void decoratesCheckedException() { void decoratesUncheckedException() { Assertions.assertThrows( IllegalStateException.class, - () -> new AtComposite( + () -> new AtLambda( Phi.Φ, self -> { throw new IllegalStateException("intended unchecked"); @@ -66,7 +66,7 @@ void decoratesUncheckedException() { void passesSelfCorrectly() { final Dummy dummy = new Dummy(); final Phi phi = new PhConst(dummy); - phi.attr("φ").get(); + phi.attr(Attr.LAMBDA).get(); MatcherAssert.assertThat( dummy.self, Matchers.equalTo(phi) @@ -77,7 +77,7 @@ void passesSelfCorrectly() { void passesSelfCorrectlyThroughChild() { final Dummy dummy = new Dummy(); final Phi phi = new PhConst(dummy); - phi.attr("φ").get(); + phi.attr(Attr.LAMBDA).get(); MatcherAssert.assertThat( dummy.self, Matchers.equalTo(phi) @@ -87,7 +87,7 @@ void passesSelfCorrectlyThroughChild() { @Test void goesThroughJustOnce() { final Phi rnd = new Rnd(); - final Phi phi = new PhMethod(rnd, "φ"); + final Phi phi = new PhMethod(rnd, Attr.LAMBDA); MatcherAssert.assertThat( new Dataized(phi).take(Double.class), Matchers.equalTo( @@ -112,8 +112,8 @@ private static class Dummy extends PhDefault { Dummy() { super(); this.add( - "φ", - new AtComposite( + Attr.LAMBDA, + new AtLambda( this, rho -> { this.self = rho; @@ -135,8 +135,8 @@ private static class Rnd extends PhDefault { Rnd() { super(); this.add( - "φ", - new AtComposite( + Attr.LAMBDA, + new AtLambda( this, rho -> new Data.ToPhi(new SecureRandom().nextDouble()) )