set! takes a reference instead of just a variable

This commit is contained in:
Erik Svedäng 2017-07-13 13:08:45 +02:00
parent 6315ac963f
commit 3298fe3d32
7 changed files with 31 additions and 10 deletions

View File

@ -3,6 +3,7 @@ module Main where
import Control.Monad
import qualified System.Environment as SystemEnvironment
import System.IO (hFlush, stdout)
import System.Info (os)
import qualified Data.Map as Map
import ColorText
import Obj
@ -20,7 +21,7 @@ defaultProject = Project { projectTitle = "Untitled"
, projectEchoC = False
, projectCarpDir = "./"
, projectOutDir = "./out/"
, projectPrompt = "> "
, projectPrompt = if os == "darwin" then " " else "> "
}
repl :: Context -> String -> IO ()

View File

@ -24,7 +24,7 @@
(list (quote do)
body
(list
(quote set!) (car settings)
(quote set!) (list (quote ref) (car settings))
(list (quote Int.+)
(car settings)
(if (= 4 (count settings)) ;; optional arg for step

View File

@ -68,8 +68,8 @@
(defn macrooo2 []
(for [x 1 3]
(for [y 10 100 20]
(println (ref (str (* x y)))))))
(for [y 10 100 20]
(println (ref (str (* x y)))))))
(deftype A [s String])
(import A)

View File

@ -15,7 +15,7 @@
(if (= (ref guess) (ref "q\n"))
(do
(println (ref "Good bye..."))
(set! play false))
(set! &play false))
(do
(if (< num answer)
(println (ref "Too low."))

View File

@ -27,7 +27,8 @@
;;(def x (the (Array Int) NULL))
(defn main []
(let [x NULL]
(let [x [10]]
(do
(set! x [1 2 3])
(set! &x [1 2 3])
(set! &x [4 5 6])
(println (refstr &x)))))

View File

@ -4,7 +4,7 @@ import Data.List (intercalate, sortOn)
import Control.Monad.State
import Control.Monad (when, zipWithM_)
import qualified Data.Map as Map
--import Debug.Trace
import Debug.Trace
import Obj
import Types
@ -203,7 +203,12 @@ toC root = emitterSrc (execState (visit 0 root) (EmitterState ""))
-- Set!
XObj SetBang _ _ : variable : value : [] ->
do valueVar <- visit indent value
appendToSrc (addIndent indent ++ mangle (getName variable) ++ " = " ++ valueVar ++ ";\n")
let properVariableName = case variable of
(XObj (Lst (XObj Ref _ _ : x : _)) _ _) -> mangle (getName x)
_ -> error "How to handle setting of refs?" -- mangle (getName variable)
Just varInfo = info variable
delete indent varInfo
appendToSrc (addIndent indent ++ properVariableName ++ " = " ++ valueVar ++ ";\n")
return ""
-- The

View File

@ -474,7 +474,7 @@ genConstraints root = fmap sort (gen root)
do insideValueConstraints <- gen value
variableType <- toEither (ty variable) (ExpressionMissingType variable)
valueType <- toEither (ty value) (ExpressionMissingType value)
let sameTypeConstraint = Constraint variableType valueType variable value OrdSetBang
let sameTypeConstraint = Constraint variableType (RefTy valueType) variable value OrdSetBang
return (sameTypeConstraint : insideValueConstraints)
-- The
@ -764,6 +764,20 @@ manageMemory typeEnv globalEnv root =
return $ do okBody <- visitedBody
okBindings <- fmap (concatMap (\(n,x) -> [n, x])) (sequence visitedBindings)
return (XObj (Lst (letExpr : (XObj (Arr okBindings) bindi bindt) : okBody : [])) newInfo t)
setbangExpr@(XObj SetBang _ _) : variable : value : [] ->
do visitedValue <- visit value
unmanage value
let varInfo = info variable
correctVariable = case variable of
XObj (Lst (XObj Ref _ _ : x : _)) _ _ -> x -- Peek inside the ref to get the actual variable to set
x -> x
deleters = case createDeleter correctVariable of
Just d -> Set.fromList [d]
Nothing -> Set.empty
newVarInfo = setDeletersOnInfo varInfo deleters
newVariable = variable { info = newVarInfo }
return $ do okValue <- visitedValue
return (XObj (Lst (setbangExpr : newVariable : okValue : [])) i t)
addressExpr@(XObj Address _ _) : value : [] ->
do visitedValue <- visit value
return $ do okValue <- visitedValue