From 1f1a5ed7f0be78df9f7d94bf53d8914a4da8d63b Mon Sep 17 00:00:00 2001 From: Victor Date: Sat, 9 Jan 2016 14:54:06 +0200 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD?= =?UTF-8?q?=D0=BD=D0=B0=D1=8F=20=D1=84=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8F?= =?UTF-8?q?=20thread?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- program.own | 7 +++++- .../lib/modules/functions/std_thread.java | 24 +++++++++++++++---- 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/program.own b/program.own index 8d2c5c5..9aac799 100644 --- a/program.own +++ b/program.own @@ -111,4 +111,9 @@ println typeof({}) println typeof(add) println typeof(number("1")) -println typeof(string(1)) \ No newline at end of file +println typeof(string(1)) + +thread(::inthread) +def inthread() = echo("this is a thread") +thread(def (str) { println str }, "this is a thread with arguments") + diff --git a/src/com/annimon/ownlang/lib/modules/functions/std_thread.java b/src/com/annimon/ownlang/lib/modules/functions/std_thread.java index 9eea576..1025e75 100644 --- a/src/com/annimon/ownlang/lib/modules/functions/std_thread.java +++ b/src/com/annimon/ownlang/lib/modules/functions/std_thread.java @@ -1,20 +1,34 @@ package com.annimon.ownlang.lib.modules.functions; import com.annimon.ownlang.lib.Function; +import com.annimon.ownlang.lib.FunctionValue; import com.annimon.ownlang.lib.Functions; import com.annimon.ownlang.lib.NumberValue; +import com.annimon.ownlang.lib.Types; import com.annimon.ownlang.lib.Value; public final class std_thread implements Function { @Override public Value execute(Value... args) { - if (args.length == 1) { - // Создаём новый поток по имени функции - new Thread(() -> { - Functions.get(args[0].asString()).execute(); - }).start(); + // Создаём новый поток и передаём параметры, если есть. + // Функция может передаваться как напрямую, так и по имени + if (args.length == 0) throw new RuntimeException("At least one arg expected"); + + Function body; + if (args[0].type() == Types.FUNCTION) { + body = ((FunctionValue) args[0]).getValue(); + } else { + body = Functions.get(args[0].asString()); } + + // Сдвигаем аргументы + final Value[] params = new Value[args.length - 1]; + if (params.length > 0) { + System.arraycopy(args, 1, params, 0, params.length); + } + + new Thread(() -> body.execute(params)).start(); return NumberValue.ZERO; } } \ No newline at end of file