Memorizzazione nella cache degli argomenti del blocco di valori

A volte il generatore di codici a blocchi deve fare riferimento al codice del suo bloccare più volte.

Ad esempio, se hai un blocco che riceve l'ultimo elemento di un elenco, devi per accedere più volte al codice elenco:

// Incorrect block-code generator.
javascriptGenerator.forBlock['last_element'] = function(block, generator) {
  const listCode = generator.valueToCode(block, 'LIST', Order.MEMBER);

  // listCode gets referenced twice.
  const code = `${listCode}[${listCode}.length - 1]`;

  return [code, Order.MEMBER];
}

ma ciò può causare problemi se il valore risultante del codice del blocco interno non coerenti o presentano effetti collaterali. Ad esempio, se il codice interno è effettivamente una chiamata di funzione, questo particolare codice può risultare con una condizione fuori intervallo:

randomList()[randomList().length - 1]

Le funzioni di utilità consentono di verificare che i blocchi interni il codice è valutata una sola volta.

Funzioni di utilità

Una funzione di utilità è una funzione definita dallo sviluppatore inclusa come parte la stringa di codice generata. Puoi usarli per assicurarti che il codice del blocco interno valutato una sola volta e poi al valore può essere fatto riferimento più volte.

import {javascriptGenerator, Order} from 'blockly/javascript';

// Correct block-code generator.
javascriptGenerator.forBlock['last_element'] = function(block, generator) {
  const listCode = generator.valueToCode(block, 'LIST', Order.NONE);
  const functionName = generator.provideFunction_(
      'list_lastElement',
      [
        `function ${generator.FUNCTION_NAME_PLACEHOLDER_}(list) {`,
        `  return list[list.length - 1];`,
        `}`
      ]
  );

  // listCode only gets evaluated once.
  const code = `${functionName}(${listCode})`;
  return [code, Order.FUNCTION_CALL];
}

Fornisci la funzione

Puoi definire funzioni di utilità all'interno dei generatori di codici a blocchi utilizzando provideFunction_. Prende il nome che vuoi per la tua funzione di utilità e un array di stringhe di codice che definiscono lo scopo della funzione. Restituisce il valore il nome risultante della tua funzione di utilità, dopo (possibilmente) averlo modificato in è in conflitto con le funzioni definite dall'utente.

provideFunction_ deduplica anche le definizioni delle funzioni di utilità, in modo che ogni funzione di utilità esiste solo una volta, anche se il tipo di blocco che la definisce più volte.

Aggiorna precedenti

Quando definisci una funzione di utilità, devi aggiornare anche le precedenti (che definiscono l'inserimento delle parentesi tonde) inclusi nel un generatore di blocchi di codice.

La precedenza si basa sempre sulla stringa di codice restituita dal codice a blocchi generatore. Non gli interessa gli operatori all'interno delle funzioni di utilità. Quindi nel nell'esempio precedente la chiamata valueToCode è stata modificata in Order.NONE e La tupla di ritorno è stata modificata in Order.FUNCTION_CALL.