@moskva/runtime 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/changes.md +2 -1
- package/index.js +13 -0
- package/package.json +5 -2
- package/readme.md +28 -26
- package/test/index.js +10 -25
- package/test/index1.js +33 -0
package/changes.md
CHANGED
package/index.js
CHANGED
|
@@ -12,3 +12,16 @@ module.exports.Runnable=FnImplFactory(
|
|
|
12
12
|
console.warn('[run] not implemented')
|
|
13
13
|
}
|
|
14
14
|
}))
|
|
15
|
+
|
|
16
|
+
module.exports.Выполнимый=FnImplFactory(
|
|
17
|
+
class Выполнимый {
|
|
18
|
+
__fm() {
|
|
19
|
+
return this.вып
|
|
20
|
+
}
|
|
21
|
+
/** Выполнить операцию */
|
|
22
|
+
вып() {}
|
|
23
|
+
}, ({
|
|
24
|
+
вып() {
|
|
25
|
+
console.warn('[вып] не исполнен')
|
|
26
|
+
}
|
|
27
|
+
}))
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@moskva/runtime",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"description": "JavaScript-рантайм «Москва» с Java-подобной моделью выполнения: вызываемые Runnable-экземпляры, изоляция памяти и предсказуемая инициализация.",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"t": "git tag @javish/base-v$(node -p \"require('./package.json').version\") && git push --tags"
|
|
@@ -41,5 +41,8 @@
|
|
|
41
41
|
"управление-памятью",
|
|
42
42
|
"низкоуровневый",
|
|
43
43
|
"продвинутый"
|
|
44
|
-
]
|
|
44
|
+
],
|
|
45
|
+
"dependencies": {
|
|
46
|
+
"@javish/lib": "^0.2.1"
|
|
47
|
+
}
|
|
45
48
|
}
|
package/readme.md
CHANGED
|
@@ -1,59 +1,61 @@
|
|
|
1
1
|
# Рантайм Москва
|
|
2
2
|
|
|
3
3
|
<p>
|
|
4
|
-
<img src="https://media-743523.gitlab.io/img/
|
|
4
|
+
<img src="https://media-743523.gitlab.io/img/header-npm.jpg" alt="РАНТsАЙМ МОСКВА NPM ПАКЕТ">
|
|
5
5
|
</p>
|
|
6
6
|
|
|
7
7
|
Этот рантайм предоставляет вызываемые экземпляры функциональных интерфейсов
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
`Выполнимый`. `Выполнимый` — это экземпляр класса, который можно вызывать как
|
|
9
|
+
функцию, аналогично лямбда-выражениям в Java.
|
|
10
10
|
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
```java
|
|
12
|
+
// java:
|
|
13
|
+
interface Выполнимый {
|
|
14
|
+
void вып() {}
|
|
14
15
|
}
|
|
15
16
|
```
|
|
16
17
|
|
|
18
|
+
<!-- Любой интерфейс в Java с одной абстрактной функцией будет функциональным. -->
|
|
19
|
+
|
|
17
20
|
## Использование
|
|
18
21
|
|
|
19
|
-
Пример ниже показывает, что несмотря на то, что
|
|
22
|
+
Пример ниже показывает, что несмотря на то, что `выполнимый` является
|
|
23
|
+
экземпляром класса, его всё равно можно вызывать как функцию:
|
|
20
24
|
|
|
21
25
|
```js
|
|
22
|
-
var{
|
|
26
|
+
var{Выполнимый}=require('@moskva/runtime')
|
|
23
27
|
|
|
24
|
-
var
|
|
25
|
-
|
|
26
|
-
this
|
|
27
|
-
this.test.push(new Date)
|
|
28
|
-
// или this.test=['test']
|
|
28
|
+
var выполнимый=new class extends Выполнимый {
|
|
29
|
+
конструктор(){
|
|
30
|
+
this.тест=[new Date]
|
|
29
31
|
}
|
|
30
|
-
|
|
31
|
-
return this
|
|
32
|
+
тест2(){
|
|
33
|
+
return this.тест
|
|
32
34
|
}
|
|
33
|
-
|
|
34
|
-
console.log(' <
|
|
35
|
+
вып(){
|
|
36
|
+
console.log(' < Привет, выполнимый; тест =',this.тест2())
|
|
35
37
|
}
|
|
36
38
|
}
|
|
37
39
|
|
|
38
|
-
console.log('
|
|
39
|
-
|
|
40
|
+
console.log('вызов выполняемого:')
|
|
41
|
+
выполнимый()
|
|
40
42
|
```
|
|
41
43
|
|
|
42
44
|
```sh
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
<
|
|
45
|
+
создан новый функциональный [class Выполнимый]
|
|
46
|
+
вызов выполнимого:
|
|
47
|
+
< Привет выполнимый; тест = [ 2026-01-28T02:20:37.339Z ]
|
|
46
48
|
```
|
|
47
49
|
|
|
48
50
|
### Назначение
|
|
49
51
|
|
|
50
52
|
Экземпляры стандартных, не-runnable классов нельзя вызывать. Такое поведение
|
|
51
|
-
доступно только при наследовании от
|
|
53
|
+
доступно только при наследовании от `Выполнимый` и предназначено для эмуляции
|
|
52
54
|
функциональных интерфейсов Java, которые предполагают реализацию одного метода.
|
|
53
55
|
|
|
54
56
|
## Требования к реализации
|
|
55
57
|
|
|
56
|
-
* Метод
|
|
58
|
+
* Метод `вып` **обязан** быть реализован. Он является точкой входа, которая
|
|
57
59
|
вызывается при обращении к экземпляру как к функции.
|
|
58
60
|
* Реализация может получать доступ к дополнительным внутренним API через `this`.
|
|
59
61
|
|
|
@@ -62,8 +64,8 @@ calling runner:
|
|
|
62
64
|
Поля экземпляра должны инициализироваться внутри метода `const`.
|
|
63
65
|
|
|
64
66
|
Синтаксис полей класса не поддерживается. Реализация основана на proxy, и
|
|
65
|
-
создание
|
|
66
|
-
настоящее время не существует безопасного способа перехватить или извлечь
|
|
67
|
+
создание `Выполнимый` с инициализаторами полей приведёт к бесконечной рекурсии.
|
|
68
|
+
В настоящее время не существует безопасного способа перехватить или извлечь
|
|
67
69
|
инициализаторы полей.
|
|
68
70
|
|
|
69
71
|
Пока не будет найдено жизнеспособное решение, это ограничение сохранится.
|
package/test/index.js
CHANGED
|
@@ -1,31 +1,16 @@
|
|
|
1
|
-
var {
|
|
1
|
+
var {Выполнимый} = require('..')
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
|
|
5
|
-
this
|
|
6
|
-
this.test.push(new Date)
|
|
3
|
+
var выполнимый = new class extends Выполнимый {
|
|
4
|
+
конструктор() {
|
|
5
|
+
this.тест=[new Date]
|
|
7
6
|
}
|
|
8
|
-
|
|
9
|
-
return this
|
|
7
|
+
тест2() {
|
|
8
|
+
return this.тест
|
|
10
9
|
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
console.log(' < Hello runner; test =',this.test2())
|
|
10
|
+
вып() {
|
|
11
|
+
console.log(' < Привет выполнимый; тест =',this.тест2())
|
|
14
12
|
}
|
|
15
13
|
}
|
|
16
14
|
|
|
17
|
-
console.log('
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
var runner2 = new class extends Runnable {
|
|
21
|
-
const() {
|
|
22
|
-
this.test=['test']
|
|
23
|
-
}
|
|
24
|
-
run() {
|
|
25
|
-
// it needs to have this of the runner also
|
|
26
|
-
console.log(' < Hello runner2; test =',this.test)
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
console.log('calling runner2:')
|
|
31
|
-
runner2()
|
|
15
|
+
console.log('выполняем выполнимый:')
|
|
16
|
+
выполнимый()
|
package/test/index1.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
var {Runnable} = require('..')
|
|
2
|
+
|
|
3
|
+
var runner = new class extends Runnable {
|
|
4
|
+
const() {
|
|
5
|
+
this.test=[]
|
|
6
|
+
this.test.push(new Date)
|
|
7
|
+
}
|
|
8
|
+
test2() {
|
|
9
|
+
return this.test
|
|
10
|
+
}
|
|
11
|
+
run() {
|
|
12
|
+
// it needs to have this of the runner also
|
|
13
|
+
console.log(' < Hello runner; test =',this.test2())
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
console.log('calling runner:')
|
|
18
|
+
runner()
|
|
19
|
+
|
|
20
|
+
var runner2 = new class extends Runnable {
|
|
21
|
+
const() {
|
|
22
|
+
this.test=['test']
|
|
23
|
+
}
|
|
24
|
+
run() {
|
|
25
|
+
// it needs to have this of the runner also
|
|
26
|
+
console.log(' < Hello runner2; test =',this.test)
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
console.log('calling runner2:')
|
|
31
|
+
runner2()
|
|
32
|
+
|
|
33
|
+
require(',/index1')
|