Skip to content

Commit

Permalink
Make QuitException for Q
Browse files Browse the repository at this point in the history
  • Loading branch information
ysthakur committed May 24, 2023
1 parent 1dfab17 commit 0aaef87
Show file tree
Hide file tree
Showing 7 changed files with 33 additions and 37 deletions.
34 changes: 8 additions & 26 deletions shared/src/main/scala/Elements.scala
Expand Up @@ -21,11 +21,6 @@ case class Element(
impl: DirectFn
)

case class UnimplementedOverloadException(element: String, args: Seq[VAny])
extends RuntimeException(
s"$element not supported for input(s) ${args.mkString("(", ", ", ")")}"
)

object Elements:
val elements: Map[String, Element] = Impls.elements.toMap

Expand Down Expand Up @@ -177,7 +172,7 @@ object Elements:
List("append"),
"a: any, b: any -> list(a) ++ [b]"
) { case (a, b) =>
VList(ListHelpers.makeIterable(a) :+ b*)
VList.from(ListHelpers.makeIterable(a) :+ b)
}

addFull(
Expand Down Expand Up @@ -299,9 +294,7 @@ object Elements:
List("exit", "quit"),
None,
"a -> Stop program execution"
) { ctx ?=>
throw new Exception("Program exited")
}
) { ctx ?=> throw new QuitException }

def execHelper(value: VAny)(using ctx: Context): VAny =
value match
Expand Down Expand Up @@ -668,29 +661,18 @@ object Elements:
List("prefixes"),
"a: lst -> Prefixes of a"
) {
case a: VList => ListHelpers.prefixes(a)
case a: VList => VList.from(ListHelpers.prefixes(a))
case a: String =>
VList.from(
ListHelpers
.prefixes(
VList.from(ListHelpers.makeIterable(a))
)
.map(_ match
case b: VList => b.mkString
case _1 => _1.toString
)
.prefixes(ListHelpers.makeIterable(a))
.map(_.mkString)
)
case a: VNum =>
VList.from(
ListHelpers
.prefixes(
ListHelpers.makeIterable(a.vabs)
)
.map(_ match
case b: VList => b.mkString
case b => b.toString
)
.map(MiscHelpers.eval)
.prefixes(ListHelpers.makeIterable(a.vabs))
.map(n => MiscHelpers.eval(n.mkString))
)
}

Expand Down Expand Up @@ -833,7 +815,7 @@ object Elements:
) {
case a: VNum => a * 3
case a: String => a.forall(_.isLetter)
case a: VList => ListHelpers.transpose(a, None)
case a: VList => ListHelpers.transpose(a)
}

val triplicate =
Expand Down
8 changes: 8 additions & 0 deletions shared/src/main/scala/Exceptions.scala
@@ -0,0 +1,8 @@
package vyxal

case class UnimplementedOverloadException(element: String, args: Seq[VAny])
extends RuntimeException(
s"$element not supported for input(s) ${args.mkString("(", ", ", ")")}"
)

class QuitException extends RuntimeException("Program quit")
2 changes: 0 additions & 2 deletions shared/src/main/scala/FuncHelpers.scala
@@ -1,7 +1,5 @@
package vyxal

import vyxal.impls.UnimplementedOverloadException

/** Helpers for function-related stuff */
object FuncHelpers:
/** Vectorise a function object */
Expand Down
7 changes: 2 additions & 5 deletions shared/src/main/scala/Functions.scala
@@ -1,7 +1,5 @@
package vyxal

import vyxal.impls.UnimplementedOverloadException

//These represent normal Scala functions, not functions operating on the stack
type Monad = VAny => Context ?=> VAny
type Dyad = (VAny, VAny) => Context ?=> VAny
Expand Down Expand Up @@ -30,9 +28,8 @@ sealed abstract class ImplHelpers[P, F](val arity: Int):

/** Turn a partial implementation into a complete one
*
* The returned function throws an
* [[vyxal.impls.UnimplementedOverloadException]] when passed an argument for
* which it's not defined
* The returned function throws an [[vyxal.UnimplementedOverloadException]]
* when passed an argument for which it's not defined
*/
def fill(symbol: String, impl: P): F

Expand Down
3 changes: 2 additions & 1 deletion shared/src/main/scala/Interpreter.scala
Expand Up @@ -19,7 +19,8 @@ object Interpreter:
if Lexer.hasSugar(sbcsified) then ctx.globals.printFn(ast.toVyxal)
if ctx.settings.logLevel == LogLevel.Debug then
println(s"Executing '$code' (ast: $ast)")
execute(ast)
try execute(ast)
catch case _: QuitException => {}
// todo implicit output according to settings
if !ctx.isStackEmpty && ctx.settings.endPrintMode == EndPrintMode.Default
then vyPrintln(ctx.peek)
Expand Down
6 changes: 3 additions & 3 deletions shared/src/main/scala/ListHelpers.scala
Expand Up @@ -202,7 +202,7 @@ object ListHelpers:

VList(out*)
case None =>
return VList(
VList(
iterable.zipWithIndex
.sorted { (a, b) =>
MiscHelpers.compareExact(
Expand All @@ -215,8 +215,8 @@ object ListHelpers:

end sortBy

def prefixes(iterable: VList)(using ctx: Context): VList =
return VList.from(iterable.inits.toSeq.reverse.tail)
def prefixes(iterable: VList): Seq[VList] =
iterable.inits.toSeq.reverse.tail

/** Split a list on a sublist
*
Expand Down
10 changes: 10 additions & 0 deletions shared/src/test/scala/ElementTests.scala
Expand Up @@ -560,10 +560,20 @@ class ElementTests extends VyxalTests:
VNum(4824)
),
List[VAny](VNum(-342)) -> VList(VNum(3), VNum(34), VNum(342)),
)
}

describe("when given a string") {
testMulti("P")(
List[VAny]("Hello") -> VList("H", "He", "Hel", "Hell", "Hello"),
List[VAny]("abc") -> VList("a", "ab", "abc"),
List[VAny]("123") -> VList("1", "12", "123"),
List[VAny]("") -> VList(),
)
}

describe("when given a list") {
testMulti("P")(
List[VAny](VList(1, 2, 3)) -> VList(
VList(1),
VList(1, 2),
Expand Down

0 comments on commit 0aaef87

Please sign in to comment.