Транскрипт и ТранскриптФраме

Прямо сейчас я работаю над оболочкой для общих функций транскрипта под названием TranscryptFrame. Я получаю сообщение об ошибке компилятора, и мне хотелось бы знать, можем ли мы каким-либо образом решить эту проблему, возможно, это просто небольшое изменение в коде, чтобы все заработало.

Вам нужно иметь последний файл TranscryptFrame.py в рабочем каталоге для компиляции. Вы найдете его здесь: https://github.com/bunkahle/Transcrypt-Examples/blob/master/dom/TranscryptFrame.py — не стесняйтесь предлагать изменения или улучшения в этом файле или сообщать об ошибках. Возможно, в будущем он будет доступен как библиотека.

Итак, вот код, который даже не компилируется, я получаю сообщение об ошибке, которое не может быть назначено вызову функции.

# change_text2a_tf.py
import TranscryptFrame as tf

def insert():
    # working:
    # myElement = tf.S("#intro")
    # tf.S("#demo").innerHTML = "The text from the intro paragraph is " + myElement.innerHTML

    # working:
    # myElement_htm = tf.S("#intro", "htm")
    # tf.S("#demo").innerHTML = "The text from the intro paragraph is " + myElement_htm

    # working:
    # tf.S("#demo").innerHTML = "The text from the intro paragraph is " + tf.S("#intro", "htm")

    # not working: can't assign to function call on compiling
    tf.S("#demo", "htm") = "The text from the intro paragraph is " + tf.S("#intro", "htm")

и это html для его запуска:

<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <script src="__javascript__/change_text2a_tf.js"></script>
    <title>Change Text with TranscryptFrame</title>
  </head>
  <body onload=change_text2a_tf.insert()>
    <p id="intro"><b>Hello World!</b></p>
    <p>This example demonstrates the <b>getElementById</b> method!</p>
    <p id="demo"></p>
  </body>
</html>

person bunkus    schedule 05.03.2018    source источник


Ответы (2)


В линии:

tf.S("#demo", "htm") = "The text from the intro paragraph is " + tf.S("#intro", "htm")

вы что-то присваиваете результату функции, а именно tf.S("#demo", "htm")

Это невозможно в Python, JavaScript или Transcrypt. В C++ это возможно, возвращая ссылку, но C++ в этом довольно уникален.

Функция в Python, JavaScript или Transcrypt возвращает не LValue (местоположение в памяти), а RValue (значение, которое находится в этом месте). Вы не можете ничего хранить в значении, только в местоположении.

В следующем фрагменте кода C++ используются ссылки и вызов функции слева от =:

float &lowestGrade (float &x, float & y) {
    return x < y ? x : y;
}

Его можно назвать следующим образом:

grade1 = 4;
grade2 = 6;
lowestGrade  (grade1, grade2) += 2;

Обратите внимание, что после этого grade1 будет 6.

Но, как уже говорилось, функции, возвращающие LValues ​​(местоположения в памяти), довольно уникальны для C++.

person Jacques de Hooge    schedule 05.03.2018

Итак, самый короткий способ сделать это:

tf.S("#demo").innerHTML = "The text from the intro paragraph is " + \
                           tf.S("#intro", "htm")

Если бы я хотел что-то вроде JQuery:

$("#demo").html("The text from the intro paragraph is ")

Мне нужно было бы вызвать прагму для JQuery, например:

__pragma__ ('alias', 'S', '$')
S("#demo").html("The text from the intro paragraph is ")

и импортируйте библиотеку JQuery в html-документ с помощью

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script>

Единственный способ иметь что-то вроде

import TranscryptFrame as tf
tf.S("#demo").html("The text from the intro paragraph is ")

было бы запрограммировать класс с именем S или с другим именем, например D (для документа), чтобы я мог обрабатывать его как объект с помощью tf.D("#demo").html(*args). Но поскольку JQuery уже существует, на самом деле нет смысла реализовывать класс в TranscryptFrame, а просто использовать прагму и существующую библиотеку JQuery, например:

__pragma__ ('alias', 'S', '$')
S("#demo").html("The text from the intro paragraph is ")
person bunkus    schedule 06.03.2018
comment
Возможно, вы могли бы использовать свойства Python / Transcrypt здесь, чтобы получить элегантную нотацию. Присвоение свойств затем вызовет функцию, которая вызовет метод JQueries .html (‹aText›). - person Jacques de Hooge; 06.03.2018
comment
Как, на ваш взгляд, выглядела бы элегантная нотация? Нотация JQuery довольно короткая и весьма эффективная. Возможно, будет более питонический стиль, но я пока не знаю, как это может понравиться. Я пытался реализовать такие функции, как tf.doc_id(idname) в TranscryptFrame, но они все еще довольно длинные по сравнению с JQuery. - person bunkus; 08.03.2018