コード例 #1
0
        public object alterRoot(IFn fn, ISeq args)
        {
            object newRoot = fn.applyTo(RT.cons(_root, args));

            Validate(getValidator(), newRoot);
            object oldroot = _root;

            _root = newRoot;
            ++_rev;
            NotifyWatches(oldroot, newRoot);
            return(newRoot);
        }
コード例 #2
0
ファイル: Atom.cs プロジェクト: yorig/clojure-clr.fif
 public object swap(IFn f, Object x, Object y, ISeq args)
 {
     for (; ;)
     {
         object v    = deref();
         object newv = f.applyTo(RT.listStar(v, x, y, args));
         Validate(newv);
         if (_state.CompareAndSet(v, newv))
         {
             NotifyWatches(v, newv);
             return(newv);
         }
     }
 }
コード例 #3
0
ファイル: Atom.cs プロジェクト: nasser/Clojure.Runtime
 public IPersistentVector swapVals(IFn f, object x, object y, ISeq args)
 {
     for (; ;)
     {
         object oldv = deref();
         object newv = f.applyTo(RT.listStar(oldv, x, y, args));
         Validate(newv);
         if (_state.CompareAndSet(oldv, newv))
         {
             NotifyWatches(oldv, newv);
             return(LazilyPersistentVector.createOwning(oldv, newv));
         }
     }
 }
コード例 #4
0
            /// <summary>
            /// Worker method to execute the action on a thread.
            /// </summary>
            /// <param name="state">(not used)</param>
            /// <remarks>corresponds to doRun in Java version</remarks>
            void ExecuteAction(object state)
            {
                try
                {
                    Var.pushThreadBindings(RT.map(RT.AGENT, _agent));
                    Agent.Nested = PersistentVector.EMPTY;

                    bool hadError = false;

                    try
                    {
                        object oldval = _agent.State;
                        object newval = _fn.applyTo(RT.cons(_agent.State, _args));
                        _agent.SetState(newval);
                        _agent.notifyWatches(oldval, newval);
                    }
                    catch (Exception e)
                    {
                        // TODO: report/callback  (Java TODO)
                        _agent.AddError(e);
                        hadError = true;
                    }

                    if (!hadError)
                    {
                        releasePendingSends();
                    }

                    bool             popped = false;
                    IPersistentStack next   = null;
                    while (!popped)
                    {
                        IPersistentStack prior = _agent._q.Get();
                        next   = prior.pop();
                        popped = _agent._q.CompareAndSet(prior, next);
                    }

                    if (next.count() > 0)
                    {
                        ((Action)next.peek()).execute();
                    }
                }
                finally
                {
                    Nested = null;
                    Var.popThreadBindings();
                }
            }
コード例 #5
0
ファイル: AReferenceTests.cs プロジェクト: ryrency/Misc
        public void AlterMeta_changes_meta()
        {
            MockRepository mocks = new MockRepository();
            IPersistentMap meta  = mocks.StrictMock <IPersistentMap>();
            IFn            fn    = mocks.StrictMock <IFn>();

            RMExpect.Call(fn.applyTo(null)).IgnoreArguments().Return(meta);
            mocks.ReplayAll();

            ConcreteAReference c = new ConcreteAReference();

            c.alterMeta(fn, null);

            Expect(c.meta(), EqualTo(meta));
            mocks.VerifyAll();
        }
コード例 #6
0
 public void step(LazyTransformer lt)
 {
     while (lt._stepper != null && MoveNext())
     {
         if (RT.isReduced(_xform.applyTo(RT.cons(lt, Current()))))
         {
             if (lt._rest != null)
             {
                 lt._rest._stepper = null;
             }
             break;
         }
     }
     if (lt._stepper != null)
     {
         _xform.invoke(lt);
     }
 }
コード例 #7
0
        private bool Step()
        {
            _next = NONE;

            while (_next == NONE)
            {
                if (_buffer.IsEmpty())
                {
                    if (_completed)
                    {
                        return(false);
                    }
                    else if (_sourceEnum.MoveNext())
                    {
                        object iter;
                        if (_multi)
                        {
                            iter = _xf.applyTo(RT.cons(null, _sourceEnum.Current));
                        }
                        else
                        {
                            iter = _xf.invoke(null, _sourceEnum.Current);
                        }

                        if (RT.isReduced(iter))
                        {
                            _xf.invoke(null);
                            _completed = true;
                        }
                    }
                    else
                    {
                        _xf.invoke(null);
                        _completed = true;
                    }
                }
                else
                {
                    _next = _buffer.Remove();
                }
            }
            return(true);
        }
コード例 #8
0
 public object Eval()
 {
     try
     {
         IFn fn = (IFn)_fexpr.Eval();
         IPersistentVector argvs = PersistentVector.EMPTY;
         for (int i = 0; i < _args.count(); i++)
         {
             argvs = (IPersistentVector)argvs.cons(((Expr)_args.nth(i)).Eval());
         }
         return(fn.applyTo(RT.seq(Util.Ret1(argvs, argvs = null))));
     }
     catch (Compiler.CompilerException)
     {
         throw;
     }
     catch (Exception e)
     {
         throw new Compiler.CompilerException(_source, Compiler.GetLineFromSpanMap(_spanMap), Compiler.GetColumnFromSpanMap(_spanMap), e);
     }
 }
コード例 #9
0
 public void step(LazyTransformer lt)
 {
     while (lt._stepper != null && MoveNext())
     {
         if (RT.isReduced(_xform.applyTo(RT.cons(lt, Current()))))
         {
             lt._stepper = null;
             LazyTransformer et = lt;
             while (et._rest != null)
             {
                 et          = et._rest;
                 et._stepper = null;
             }
             _xform.invoke(et);
             return;
         }
     }
     if (lt._stepper != null)
     {
         _xform.invoke(lt);
     }
 }
コード例 #10
0
ファイル: AReference.cs プロジェクト: nasser/Clojure.Runtime
 public IPersistentMap alterMeta(IFn alter, ISeq args)
 {
     _meta = (IPersistentMap)alter.applyTo(new Cons(_meta, args));
     return(_meta);
 }
コード例 #11
0
ファイル: Var.cs プロジェクト: telefunkenvf14/clojure-clr
 public object alterRoot(IFn fn, ISeq args)
 {
     object newRoot = fn.applyTo(RT.cons(_root, args));
     Validate(getValidator(), newRoot);
     object oldroot = _root;
     _root = newRoot;
     ++_rev;
     NotifyWatches(oldroot,newRoot);
     return newRoot;
 }
コード例 #12
0
            void ExecuteAction(object state)
            {
                try
                {
                    Agent.Nested = PersistentVector.EMPTY;

                    Exception error = null;

                    try
                    {
                        object oldval = _agent.State;
                        object newval = _fn.applyTo(RT.cons(_agent.State, _args));
                        _agent.SetState(newval);
                        _agent.NotifyWatches(oldval, newval);
                    }
                    catch (Exception e)
                    {
                        error = e;
                    }

                    if (error == null)
                    {
                        releasePendingSends();
                    }
                    else
                    {
                        Nested = null;  // allow errorHandler to send
                        if (_agent._errorHandler != null)
                        {
                            try
                            {
                                _agent._errorHandler.invoke(_agent, error);
                            }
                            catch (Exception)
                            {
                                // ignore error handler errors
                            }
                        }
                        if (_agent._errorMode == ContinueKeyword)
                        {
                            error = null;
                        }
                    }

                    bool        popped = false;
                    ActionQueue next   = null;
                    while (!popped)
                    {
                        ActionQueue prior = _agent._aq.Get();
                        next   = new ActionQueue(prior._q.pop(), error);
                        popped = _agent._aq.CompareAndSet(prior, next);
                    }

                    if (error == null && next._q.count() > 0)
                    {
                        ((Action)next._q.peek()).execute();
                    }
                }
                finally
                {
                    Nested = null;
                }
            }
コード例 #13
0
ファイル: Var.cs プロジェクト: telefunkenvf14/clojure-clr
 public object alter(IFn fn, ISeq args)
 {
     set(fn.applyTo(RT.cons(deref(), args)));
     return this;
 }
コード例 #14
0
ファイル: AReference.cs プロジェクト: TerabyteX/clojure-clr
 public IPersistentMap alterMeta(IFn alter, ISeq args)
 {
     _meta = (IPersistentMap)alter.applyTo(new Cons(_meta, args));
     return _meta;
 }
コード例 #15
0
        /// <summary>
        /// Post a commute on a ref in this transaction.
        /// </summary>
        /// <param name="r">The ref.</param>
        /// <param name="fn">The commuting function.</param>
        /// <param name="args">Additional arguments to the function.</param>
        /// <returns>The computed value.</returns>
        internal object DoCommute(Ref r, IFn fn, ISeq args)
        {
            if (!_info.IsRunning)
                throw _retryex;
            if (!_vals.ContainsKey(r))
            {
                object val = null;
                try
                {
                    r.EnterReadLock();
                    val = r.TryGetVal();
                }
                finally
                {
                    r.ExitReadLock();
                }
                _vals[r] = val;
            }
            List<CFn> fns;
            if (! _commutes.TryGetValue(r, out fns))
                _commutes[r] = fns = new List<CFn>();
            fns.Add(new CFn(fn, args));
            object ret = fn.applyTo(RT.cons(_vals[r], args));
            _vals[r] = ret;

            return ret;
        }
コード例 #16
0
        public static void Main(string[] args)
        {
            new Mono.Terminal.LineEditor("#force-mono.terminal-assembly-load#");
            BootClojureAndNostrand();
            if (args.Length > 0)
            {
                AppDomain.CurrentDomain.AssemblyResolve += AssemblyResolver.Resolve;

                if (File.Exists("project.edn"))
                {
                    var projectEdn = EdnReader.readString(File.ReadAllText("project.edn"), PersistentHashMap.EMPTY);
                    RT.var("nostrand.core", "establish-environment").invoke(projectEdn);
                }

                RT.PostBootstrapInit();

                var input       = ReadArguments(args);
                var inputString = input.first().ToString();
                if (inputString.IndexOf("./", StringComparison.InvariantCulture) == 0)
                {
                    inputString = inputString.Substring(2);
                }

                Var.pushThreadBindings(RT.mapUniqueKeys(RT.CurrentNSVar, Namespace.find(Symbol.intern("nostrand.core"))));
                try
                {
                    Var fn = FindFunction(inputString);

                    if (fn != null)
                    {
                        //referAll.invoke(fn.Namespace, nostrandCore);
                        fn.applyTo(input.next());
                        return;
                    }
                    if (File.Exists(inputString))
                    {
                        try
                        {
                            IFn mainFn = FindFunction(FileToRelativePath(inputString) + "/-main");
                            if (mainFn != null)
                            {
                                mainFn.applyTo(input.next());
                            }
                            return;
                        }
                        catch (FileNotFoundException)
                        {
                        }
                    }

                    Terminal.Message("Quiting", "could not find function or file named `" + args[0] + "'", ConsoleColor.Yellow);
                }
                finally
                {
                    Var.popThreadBindings();
                }
            }

            else
            {
                Terminal.Message("Nostrand", Version(), ConsoleColor.White);
                // Terminal.Message("Mono", GetRuntimeVersion(), ConsoleColor.White);
                Terminal.Message("Clojure", RT.var("clojure.core", "clojure-version").invoke(), ConsoleColor.White);
            }
        }
コード例 #17
0
ファイル: Ref.cs プロジェクト: rpete4130/clojure-clr
        public object alter(IFn fn, ISeq args)
        {
            LockingTransaction t = LockingTransaction.GetEx();

            return(t.DoSet(this, fn.applyTo(RT.cons(t.DoGet(this), args))));
        }
コード例 #18
0
ファイル: Atom.cs プロジェクト: richhickey/clojure-clr
 public object swap(IFn f, Object x, Object y, ISeq args)
 {
     for (; ; )
     {
         object v = deref();
         object newv = f.applyTo(RT.listStar(v, x, y, args));
         Validate(newv);
         if (_state.CompareAndSet(v, newv))
         {
             NotifyWatches(v, newv);
             return newv;
         }
     }
 }
コード例 #19
0
ファイル: Var.cs プロジェクト: willemdijkgraaf/ClojureClr
 public object alter(IFn fn, ISeq args)
 {
     set(fn.applyTo(RT.cons(deref(), args)));
     return(this);
 }