std/jsffi
SourceEditЭтот модуль реализует типы и макросы для облегчения обертывания и взаимодействия с JavaScript-библиотеками. Использование предоставленных типов JsObject и JsAssoc вместе с предоставленными макросами обеспечивает более плавное взаимодействие с JavaScript, позволяя, например, быстро и легко импортировать JavaScript-переменные:
Пример:
import std/jsffi
# Here, we are using jQuery for just a few calls and do not want to wrap the
# whole library:
# import the document object and the console
var document {.importc, nodecl.}: JsObject
var console {.importc, nodecl.}: JsObject
# import the "$" function
proc jq(selector: JsObject): JsObject {.importjs: "$$(#)".}
# Use jQuery to make the following code run, after the document is ready.
# This uses an experimental `.()` operator for `JsObject`, to emit
# JavaScript calls, when no corresponding proc exists for `JsObject`.
proc main =
jq(document).ready(proc() =
console.log("Hello JavaScript!")
) Импорты
- макросы, таблицы
Типы
JsAssoc[K; V] = ref object of JsRoot
- Статически типизированная оболочка вокруг JavaScript-объекта. Source Edit
Переменные
jsArguments {.importc: "arguments", nodecl.}: JsObject- Псевдопеременная arguments JavaScript. Source Edit
jsDirname {.importc: "__dirname", nodecl.}: cstring- Псевдопеременная __dirname JavaScript. Source Edit
Процедуры
proc `%`(x, y: JsObject): JsObject {.importjs: "(# % #)", ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `%=`(x, y: JsObject): JsObject {.importjs: "(# %= #)", discardable, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `&`(a, b: cstring): cstring {.importjs: "(# + #)", ...raises: [], tags: [], forbids: [].}- Оператор конкатенации для строк JavaScript. Исходный код Редактировать
proc `*`(x, y: JsObject): JsObject {.importjs: "(# * #)", ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `**`(x, y: JsObject): JsObject {.importjs: "((#) ** #)", ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `*=`(x, y: JsObject): JsObject {.importjs: "(# *= #)", discardable, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `+`(x, y: JsObject): JsObject {.importjs: "(# + #)", ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `++`(x: JsObject): JsObject {.importjs: "(++#)", ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `+=`(x, y: JsObject): JsObject {.importjs: "(# += #)", discardable, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `-`(x, y: JsObject): JsObject {.importjs: "(# - #)", ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `--`(x: JsObject): JsObject {.importjs: "(--#)", ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `-=`(x, y: JsObject): JsObject {.importjs: "(# -= #)", discardable, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `/`(x, y: JsObject): JsObject {.importjs: "(# / #)", ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `/=`(x, y: JsObject): JsObject {.importjs: "(# /= #)", discardable, ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `<`(x, y: JsObject): JsObject {.importjs: "(# < #)", ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `<=`(x, y: JsObject): JsObject {.importjs: "(# <= #)", ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `==`(x, y: JsRoot): bool {.importjs: "(# === #)", ...raises: [], tags: [], forbids: [].}- Сравнивает два JsObject или JsAssoc. Однако будьте осторожны, так как это сравнение, как в JavaScript, поэтому, если ваши JsObject фактически являются JavaScript-объектами, а не строками или числами, это сравнение ссылок. Исходный код Редактировать
proc `>`(x, y: JsObject): JsObject {.importjs: "(# > #)", ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `>=`(x, y: JsObject): JsObject {.importjs: "(# >= #)", ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `[]`(obj: JsObject; field: cstring): JsObject {.importjs: "#[#]", ...raises: [], tags: [], forbids: [].}- Возвращает значение свойства с именем
fieldиз JsObjectobj. Исходный код Редактировать proc `[]`(obj: JsObject; field: int): JsObject {.importjs: "#[#]", ...raises: [], tags: [], forbids: [].}- Возвращает значение свойства с именем
fieldиз JsObjectobj. Исходный код Редактировать proc `[]`[K: JsKey; V](obj: JsAssoc[K, V]; field: K): V {.importjs: "#[#]", ...raises: [], tags: [], forbids: [].}- Возвращает значение свойства с именем
fieldиз JsAssocobj. Исходный код Редактировать proc `[]`[V](obj: JsAssoc[cstring, V]; field: string): V
- Исходный код Редактировать
proc `[]=`[K: JsKey; V](obj: JsAssoc[K, V]; field: K; val: V) {. importjs: "#[#] = #", ...raises: [], tags: [], forbids: [].}- Устанавливает значение свойства с именем
fieldв JsAssocobjвv. Исходный код Редактировать proc `[]=`[T](obj: JsObject; field: cstring; val: T) {.importjs: "#[#] = #", ...raises: [], tags: [], forbids: [].}- Устанавливает значение свойства с именем
fieldв JsObjectobjвv. Исходный код Редактировать proc `[]=`[T](obj: JsObject; field: int; val: T) {.importjs: "#[#] = #", ...raises: [], tags: [], forbids: [].}- Устанавливает значение свойства с именем
fieldв JsObjectobjвv. Исходный код Редактировать proc `[]=`[V](obj: JsAssoc[cstring, V]; field: string; val: V)
- Исходный код Редактировать
proc `and`(x, y: JsObject): JsObject {.importjs: "(# && #)", ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc hasOwnProperty(x: JsObject; prop: cstring): bool {. importjs: "#.hasOwnProperty(#)", ...raises: [], tags: [], forbids: [].}- Проверяет, имеет ли
xсвойство с именемprop. Исходный код Редактировать proc `in`(x, y: JsObject): JsObject {.importjs: "(# in #)", ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc isNull[T](x: T): bool {.noSideEffect, importjs: "(# === null)", ...raises: [], tags: [], forbids: [].}- Проверяет, является ли значение точно null. Исходный код Редактировать
proc isUndefined[T](x: T): bool {.noSideEffect, importjs: "(# === undefined)", ...raises: [], tags: [], forbids: [].}- Проверяет, является ли значение точно undefined. Исходный код Редактировать
proc jsDelete(x: auto): JsObject {.importjs: "(delete #)", ...raises: [], tags: [], forbids: [].}- Оператор
deleteJavaScript. Исходный код Редактировать
proc jsNew(x: auto): JsObject {.importjs: "(new #)", ...raises: [], tags: [], forbids: [].}- Преобразует обычный вызов функции в вызов оператора
newJavaScript. Исходный код Редактировать proc jsTypeOf(x: JsObject): cstring {.importjs: "typeof(#)", ...raises: [], tags: [], forbids: [].}- Возвращает имя типа JavaScript объекта JsObject в виде cstring. Исходный код Редактировать
proc newJsAssoc[K: JsKey; V](): JsAssoc[K, V] {.importjs: "{@}", ...raises: [], tags: [], forbids: [].}- Создаёт новый пустой JsAssoc с типом ключа
Kи типом значенияV. Исходный код Редактировать proc newJsObject(): JsObject {.importjs: "{@}", ...raises: [], tags: [], forbids: [].}- Создаёт новый пустой JsObject. Исходный код Редактировать
proc `not`(x: JsObject): JsObject {.importjs: "(!#)", ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc `or`(x, y: JsObject): JsObject {.importjs: "(# || #)", ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc require(module: cstring): JsObject {.importc, ...raises: [], tags: [], forbids: [].}- Функция
requireJavaScript. Исходный код Редактировать proc to(x: JsObject; T: typedesc): T:type {.importjs: "(#)", ...raises: [], tags: [], forbids: [].}- Преобразует JsObject
xв типT. Исходный код Редактировать proc toJs[T](val: T): JsObject {.importjs: "(#)", ...raises: [], tags: [], forbids: [].}- Преобразует значение любого типа в тип JsObject. Исходный код Редактировать
proc toJsKey(text: cstring; t: type cstring): cstring
- Исходный код Редактировать
proc toJsKey[T: enum](text: cstring; t: type T): T
- Исходный код Редактировать
proc toJsKey[T: SomeFloat](text: cstring; t: type T): T {. importjs: "parseFloat(#)", ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
proc toJsKey[T: SomeInteger](text: cstring; t: type T): T {. importjs: "parseInt(#)", ...raises: [], tags: [], forbids: [].}- Исходный код Редактировать
Итераторы
iterator items(obj: JsObject): JsObject {....raises: [], tags: [], forbids: [].}- Возвращает значение каждого поля в JsObject, обернутое в JsObject. Исходный код Редактировать
iterator items[K, V](assoc: JsAssoc[K, V]): V
- Возвращает значения из JsAssoc. Исходный код Редактировать
iterator keys(obj: JsObject): cstring {....raises: [], tags: [], forbids: [].}- Возвращает ключи каждого поля в JsObject. Исходный код Редактировать
iterator keys[K: JsKey; V](assoc: JsAssoc[K, V]): K
- Возвращает ключи в JsAssoc. Исходный код Редактировать
iterator pairs(obj: JsObject): (cstring, JsObject) {....raises: [], tags: [], forbids: [].}- Возвращает кортежи типа
(cstring, JsObject), где первый элемент — ключ поля в JsObject, а второй — значение, обернутое в JsObject. Исходный код Редактировать iterator pairs[K: JsKey; V](assoc: JsAssoc[K, V]): (K, V)
- Возвращает кортежи типа
(K, V), где первый элемент — ключ в JsAssoc, а второй — соответствующее значение. Исходный код Редактировать
Макросы
macro `.`(obj: JsObject; field: untyped): JsObject
- Экспериментальный оператор доступа к свойству (получение) для типа JsObject. Возвращает значение свойства с именем
fieldиз JsObjectx.Пример:
let obj = newJsObject() obj.a = 20 assert obj.a.to(int) == 20
Исходный код Редактировать macro `.`[K: cstring; V](obj: JsAssoc[K, V]; field: untyped): V
- Экспериментальный оператор доступа к свойству (получение) для типа JsAssoc. Возвращает значение свойства с именем
fieldиз JsObjectx. Исходный код Редактировать macro `.()`(obj: JsObject; field: untyped; args: varargs[JsObject, jsFromAst]): JsObject
-
Экспериментальный оператор "вызова метода" для типа JsObject. Принимает имя метода JavaScript-объекта (
field) и вызывает его сargsв качестве аргументов, возвращая JsObject (который может быть отброшен, и может бытьundefined, если метод ничего не возвращает, поэтому будьте осторожны при использовании этого.)Пример:
# Let's get back to the console example: var console {.importc, nodecl.}: JsObject let res = console.log("I return undefined!") console.log(res) # This prints undefined, as console.log always returns # undefined. Thus one has to be careful, when using # JsObject calls.Исходный код Редактировать macro `.()`[K: cstring; V: proc](obj: JsAssoc[K, V]; field: untyped; args: varargs[untyped]): auto- Экспериментальный оператор "вызова метода" для типа JsAssoc. Принимает имя метода JavaScript-объекта (
field) и вызывает его сargsв качестве аргументов. Здесь всё проверяется по типу, поэтому вам не нужно беспокоиться оundefinedзначениях возврата. Исходный код Редактировать macro `.=`(obj: JsObject; field, value: untyped): untyped
- Экспериментальный оператор доступа к свойству (установка) для типа JsObject. Устанавливает значение свойства с именем
fieldв JsObjectxна значениеvalue. Исходный код Редактировать macro `.=`[K: cstring; V](obj: JsAssoc[K, V]; field: untyped; value: V): untyped
- Экспериментальный оператор доступа к свойству (установка) для типа JsAssoc. Устанавливает значение свойства с именем
fieldв JsObjectxна значениеvalue. Исходный код Редактировать macro bindMethod(procedure: typed): auto {. ...deprecated: "Don\'t use it with closures".}-
Принимает имя процедуры и оборачивает его в лямбду, в которой отсутствует первый аргумент, который передаёт встроенную JavaScript-функцию
thisв качестве первого аргумента в процедуру. Возвращает полученную лямбду.Пример:
Мы хотим сгенерировать примерно такой JavaScript:
var obj = {a: 10}; obj.someMethod = function() { return this.a + 42; };Мы можем достичь этого, используя макрос
bindMethod.let obj = JsObject{ a: 10 } proc someMethodImpl(that: JsObject): int = that.a.to(int) + 42 obj.someMethod = bindMethod someMethodImpl # Alternatively: obj.someMethod = bindMethod proc(that: JsObject): int = that.a.to(int) + 42Исходный код Редактировать macro jsFromAst(n: untyped): untyped
- Исходный код Редактировать
macro `{}`(typ: typedesc; xs: varargs[untyped]): auto-
Принимает
typedescв качестве первого аргумента и ряд выражений типаkey: value, и возвращает значение указанного типа, где каждое полеkeyустанавливается наvalue, как указано в аргументах{}.Пример:
# Let's say we have a type with a ton of fields, where some fields do not # need to be set, and we do not want those fields to be set to `nil`: type ExtremelyHugeType = ref object a, b, c, d, e, f, g: int h, i, j, k, l: cstring # And even more fields ... let obj = ExtremelyHugeType{ a: 1, k: "foo".cstring, d: 42 } # This generates roughly the same JavaScript as: {.emit: "var obj = {a: 1, k: "foo", d: 42};".}Исходный код Редактировать
Шаблоны
template toJs(s: string): JsObject
- Исходный код Редактировать
© 2006–2024 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/jsffi.html