mirror of
https://github.com/carp-lang/Carp.git
synced 2024-09-11 05:25:28 +03:00
set! takes a reference instead of just a variable
This commit is contained in:
parent
6315ac963f
commit
3298fe3d32
@ -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 ()
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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."))
|
||||
|
@ -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)))))
|
||||
|
@ -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
|
||||
|
16
src/Infer.hs
16
src/Infer.hs
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user