OSDN Git Service

first, rest
authorsforman <sforman@hushmail.com>
Sat, 29 Jul 2023 16:53:00 +0000 (09:53 -0700)
committersforman <sforman@hushmail.com>
Sat, 29 Jul 2023 16:53:00 +0000 (09:53 -0700)
implementations/Elm/src/Joy.elm

index c25b8aa..67d90c3 100644 (file)
@@ -46,6 +46,8 @@ joy_eval symbol stack expression =
         "concat" -> joy_concat stack expression
         "cons" -> joy_cons stack expression
         "dup" -> joy_dup stack expression
+        "first" -> joy_first stack expression
+        "rest" -> joy_rest stack expression
         _ -> Err ("Unknown word: " ++ symbol)
 
 
@@ -88,6 +90,26 @@ joy_dup stack expression =
         Err msg -> Err msg
 
 
+joy_first : JList -> JList -> Result String (JList, JList)
+joy_first stack expression =
+    case pop_list(stack) of
+        Ok (a, s0) ->
+            case pop_any(a) of
+                Ok (b, _) -> Ok ((push_any b s0), expression)
+                Err _ -> Err "Cannot take first of empty list."
+        Err msg -> Err msg
+
+
+joy_rest : JList -> JList -> Result String (JList, JList)
+joy_rest stack expression =
+    case pop_list(stack) of
+        Ok (a, s0) ->
+            case pop_any(a) of
+                Ok (_, el) -> Ok ((push_list el s0), expression)
+                Err _ -> Err "Cannot take rest of empty list."
+        Err msg -> Err msg
+
+
 push_int : Int -> JList -> JList
 push_int i stack = (JoyInt i) :: stack
 
@@ -96,6 +118,10 @@ push_list : JList -> JList -> JList
 push_list el stack = (JoyList el) :: stack
 
 
+push_any : JoyType -> JList -> JList
+push_any j stack = j :: stack
+
+
 pop_int : JList -> Result String (Int, JList)
 pop_int stack = pop_any stack |> andThen isnt_int