本文整理汇总了C#中Ioke.Lang.IokeObject.Become方法的典型用法代码示例。如果您正苦于以下问题:C# IokeObject.Become方法的具体用法?C# IokeObject.Become怎么用?C# IokeObject.Become使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Ioke.Lang.IokeObject
的用法示例。
在下文中一共展示了IokeObject.Become方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: ActivateWithCallAndDataFixed
public static object ActivateWithCallAndDataFixed(IokeObject self, IokeObject context, IokeObject message, object on, object call, IDictionary<string, object> data)
{
DefaultSyntax dm = (DefaultSyntax)self.data;
object result = dm.ExpandWithCall(self, context, message, on, call, data);
if(result == context.runtime.nil) {
// Remove chain completely
IokeObject prev = Message.GetPrev(message);
IokeObject next = Message.GetNext(message);
if(prev != null) {
Message.SetNext(prev, next);
if(next != null) {
Message.SetPrev(next, prev);
}
} else {
message.Become(next, message, context);
Message.SetPrev(next, null);
}
return null;
} else {
// Insert resulting value into chain, wrapping it if it's not a message
IokeObject newObj = null;
if(IokeObject.dataOf(result) is Message) {
newObj = IokeObject.As(result, context);
} else {
newObj = context.runtime.CreateMessage(Message.Wrap(IokeObject.As(result, context)));
}
IokeObject prev = Message.GetPrev(message);
IokeObject next = Message.GetNext(message);
message.Become(newObj, message, context);
IokeObject last = newObj;
while(Message.GetNext(last) != null) {
last = Message.GetNext(last);
}
Message.SetNext(last, next);
if(next != null) {
Message.SetPrev(next, last);
}
Message.SetPrev(newObj, prev);
// We need to distinguish explicit calls to self, and calls through a local context.
object receiver = (prev == null || Message.IsTerminator(prev)) ? context : on;
return Interpreter.Send(message, context, receiver);
}
}
示例2: ActivateWithCallAndData
public override object ActivateWithCallAndData(IokeObject self, IokeObject context, IokeObject message, object on, object call, IDictionary<string, object> data)
{
object result = ExpandWithCall(self, context, message, on, call, data);
if(result == context.runtime.nil) {
// Remove chain completely
IokeObject prev = Message.GetPrev(message);
IokeObject next = Message.GetNext(message);
if(prev != null) {
Message.SetNext(prev, next);
if(next != null) {
Message.SetPrev(next, prev);
}
} else {
message.Become(next, message, context);
Message.SetPrev(next, null);
}
return null;
} else {
// Insert resulting value into chain, wrapping it if it's not a message
IokeObject newObj = null;
if(IokeObject.dataOf(result) is Message) {
newObj = IokeObject.As(result, context);
} else {
newObj = context.runtime.CreateMessage(Message.Wrap(IokeObject.As(result, context)));
}
IokeObject prev = Message.GetPrev(message);
IokeObject next = Message.GetNext(message);
message.Become(newObj, message, context);
IokeObject last = newObj;
while(Message.GetNext(last) != null) {
last = Message.GetNext(last);
}
Message.SetNext(last, next);
if(next != null) {
Message.SetPrev(next, last);
}
Message.SetPrev(newObj, prev);
return ((Message)IokeObject.dataOf(message)).SendTo(message, context, context);
}
}