Простой трюк, который сделает ваш JavaScript FFI более простым и небезопасным!

Допустим, у нас есть отличная addTwo функция в JSland, которую мы хотим вызвать. Функция просто берет аргумент и добавляет к нему два.

Было бы неплохо, если бы мы могли сделать что-нибудь простое вроде этого:

По сути, мы говорим компилятору: «Эй, поверьте мне, я получил это», и он с радостью примет ваш запрос.

Хотя это было бы здорово, это также было бы крайне небезопасно, поэтому Elm не допускает этого и заставляет вас использовать порты, более безопасный способ выполнения FFI, в основном выполняя передачу сообщений от Elm к JS и наоборот. . Так что вы должны сделать это вместо этого!

Но

Я бы не стал дразнить тебя раньше, если бы ты не сделал этого выше.

Мы можем просто определить забавную jsCall функцию:

И мы можем назвать это так, как указано выше. Это, конечно, будет компилироваться, и если мы запустим наше приложение в таком виде, оно войдет в бесконечный цикл (jsCall будет вызывать себя бесконечно).

Осталось только перейти к скомпилированному файлу (работает как с --optimize, так и без него), найти скомпилированную функцию jsCall, которая, вероятно, будет выглядеть примерно так:

И мы просто заменяем его содержимое на

Вот и все! Теперь вы можете определить window.addTwo = a => a + 2 функцию, которая будет вызываться из Elm.

Проверьте демо, используя именно код из этого поста здесь, источник здесь.

Заявление об ограничении ответственности: я не рекомендую делать это или не делать этого, мне это показалось любопытным и, возможно, иногда полезным, но, учитывая, что вы в значительной степени теряете безопасность при этом и используете хак, который может быть удален в ближайшее время, подумайте дважды, прежде чем погрузиться в что-то вроде этого.