Another ReferenceError: Variable is not defined

In my experiment I create random pseudo-words. I get the error message that my variable “word_list” is not defined.

I read that I should give my functions a name and that I should define my variables at the beginning (see below).

In the Begin Experiment tab I have the following (amateurish) JavaScript code:

shuffle = util.shuffle;

function generateRandomWord() {
const vowels = [“a”, “e”, “i”, “o”, “u”, “ü”, “ö”, “ä”];
shuffle(vowels);
const [v1, v2, v3] = vowels.slice(0, 3);

const consonants = ["k", "t", "p", "m", "n", "s", "f", "r", "l"];
shuffle(consonants);

const [k1, k2, k3, k4, k5, k6] = consonants.slice(0, 6);

return [k1 + v1 + k2, k4 + v1 + k2, k1 + v1 + k3, k1 + v2 + k2, k5 + v3 + k6];

}

function generateUniqueWords(excludeWords = ) {
let words = generateRandomWord();

while (words.some(word => excludeWords.includes(word))) {
    words = generateRandomWord();
}

return words;

}

const excludeWords = [“can”, “man”, “tus”, “kan”, “net”, “fom”, “kam”, “fan”, “ken”, “fat”, “ton”, “tom”, “tim”, “nam”, “sun”, “fuk”, “top”, “sam”, “fük”, “kif”, “tun”, “pun”, “tum”, “nit”, “tik”, “tuk”, “tüp”, “lit”, “käs”, “nim”, “mik”, “nut”, “mus”, “sum”, “sin”, “sit”, “sat”, “nas”, “mop”, “fap”, “tip”, “fon”, “sik”, “sup”, “suf”, “män”, “men”, “küs”, “fat”, “fät”, “fun”, “pan”, “kim”, “nil”, “fak”, “tan”, “son”, “not”, “lik”, “rip”, “les”, “las”, “pur”, “pul”, “sim”, “pin”, “los”, “lös”, “rem”, “ruf”, “map”, “kit”, “rat”];

const numSets = 20;

const wordsDict = {};

for (let i = 1; i <= numSets; i++) {
const words = generateUniqueWords(excludeWords);
wordsDict[initial_word_${i}] = words[0];
wordsDict[rhyming_word_${i}] = words[1];
wordsDict[same_onset_${i}] = words[2];
wordsDict[different_vowel_${i}] = words[3];
wordsDict[completely_different_${i}] = words[4];
}

const initialWordsList = Array.from({ length: numSets }, (, i) => wordsDict[initial_word_${i + 1}]);
const rhymingWordList = Array.from({ length: numSets }, (
, i) => wordsDict[rhyming_word_${i + 1}]);
const sameOnsetList = Array.from({ length: numSets }, (, i) => wordsDict[same_onset_${i + 1}]);
const differentVowelList = Array.from({ length: numSets }, (
, i) => wordsDict[different_vowel_${i + 1}]);
const completelyDifferentList = Array.from({ length: numSets }, (_, i) => wordsDict[completely_different_${i + 1}]);

let pairRhyming1 = [initialWordsList[0], rhymingWordList[0]];
let pairRhyming2 = [initialWordsList[1], rhymingWordList[1]];
let pairRhyming3 = [initialWordsList[2], rhymingWordList[2]];
let pairRhyming4 = [initialWordsList[3], rhymingWordList[3]];
let pairRhyming5 = [initialWordsList[4], rhymingWordList[4]];

pairRhyming1.push(“rhyme”);
pairRhyming2.push(“rhyme”);
pairRhyming3.push(“rhyme”);
pairRhyming4.push(“rhyme”);
pairRhyming5.push(“rhyme”);

let pairOnset1 = [initialWordsList[5], sameOnsetList[5]];
let pairOnset2 = [initialWordsList[6], sameOnsetList[6]];
let pairOnset3 = [initialWordsList[7], sameOnsetList[7]];
let pairOnset4 = [initialWordsList[8], sameOnsetList[8]];
let pairOnset5 = [initialWordsList[9], sameOnsetList[9]];

pairOnset1.push(“onset”);
pairOnset2.push(“onset”);
pairOnset3.push(“onset”);
pairOnset4.push(“onset”);
pairOnset5.push(“onset”);

let pairDifferentVowel1 = [initialWordsList[10], differentVowelList[10]];
let pairDifferentVowel2 = [initialWordsList[11], differentVowelList[11]];
let pairDifferentVowel3 = [initialWordsList[12], differentVowelList[12]];
let pairDifferentVowel4 = [initialWordsList[13], differentVowelList[13]];
let pairDifferentVowel5 = [initialWordsList[14], differentVowelList[14]];

pairDifferentVowel1.push(“different_vowel”);
pairDifferentVowel2.push(“different_vowel”);
pairDifferentVowel3.push(“different_vowel”);
pairDifferentVowel4.push(“different_vowel”);
pairDifferentVowel5.push(“different_vowel”);

let pairCompletelyDifferent1 = [initialWordsList[15], completelyDifferentList[15]];
let pairCompletelyDifferent2 = [initialWordsList[16], completelyDifferentList[16]];
let pairCompletelyDifferent3 = [initialWordsList[17], completelyDifferentList[17]];
let pairCompletelyDifferent4 = [initialWordsList[18], completelyDifferentList[18]];
let pairCompletelyDifferent5 = [initialWordsList[19], completelyDifferentList[19]];

pairCompletelyDifferent1.push(“completely_different”);
pairCompletelyDifferent2.push(“completely_different”);
pairCompletelyDifferent3.push(“completely_different”);
pairCompletelyDifferent4.push(“completely_different”);
pairCompletelyDifferent5.push(“completely_different”);

let word_list = [pairCompletelyDifferent1, pairCompletelyDifferent2, pairCompletelyDifferent3,
pairCompletelyDifferent4, pairCompletelyDifferent5, pairRhyming1, pairRhyming2, pairRhyming3, pairRhyming4, pairRhyming5, pairOnset1, pairOnset2, pairOnset3, pairOnset4, pairOnset5, pairDifferentVowel1, pairDifferentVowel2, pairDifferentVowel3, pairDifferentVowel4, pairDifferentVowel5];

shuffle(word_list);

In the Begin Routine tab I have:

positions = [[(- 0.4), (- 0.25)], [0.0, (- 0.25)], [0.4, (- 0.25)]];
shuffle(positions);
positiona = positions.shift();
positionb = positions.shift();
positionc = positions.shift();
words = word_list.shift();

source = words[0];
target = words[1];
condition = words[2];
psychoJS.experiment.addData(“source”, source);
psychoJS.experiment.addData(“target”, target);
psychoJS.experiment.addData(“condition”, condition);

I tried to move the code in the Begin Experiment tab to the Before Experiment tab, but then the experiment won’t initialize.

I read that I need to give my functions a name and I tried this:

generateRandomWord = function generateRandomWord() {
const vowels = [“a”, “e”, “i”, “o”, “u”, “ü”, “ö”, “ä”];
shuffle(vowels);
const [v1, v2, v3] = vowels.slice(0, 3);

const consonants = ["k", "t", "p", "m", "n", "s", "f", "r", "l"];
shuffle(consonants);

const [k1, k2, k3, k4, k5, k6] = consonants.slice(0, 6);

return [k1 + v1 + k2, k4 + v1 + k2, k1 + v1 + k3, k1 + v2 + k2, k5 + v3 + k6];

}

generateUniqueWords = function generateUniqueWords(excludeWords = ) {
let words = generateRandomWord();

while (words.some(word => excludeWords.includes(word))) {
    words = generateRandomWord();
}

return words;

}

But this didn’t help.

I tried to initialize the functions as well as “word_list”, e.g., like this:

generateRandomWord();
generateUniqueWords();
wordlist=;

But the best I could get is this error:

ReferenceError: can’t access lexical declaration ‘word_list’ before initialization

In the crib sheet I read

If x is a function, define it in your initial JavaScript code block

but I do not understand what exactly I should do :sweat_smile:

Help is very much appreciated! :blush: :blush:

Why are you using the word let?

I strongly recommend coding in Python with auto components whenever possible.

Defining wordlist should just be a case of putting wordlist= in Begin Experiment.

1 Like

Thanks for your answer wakecarter! I made some progress in the meantime, but it’s still not working properly.

The first stimulus now says “hello world”, the rest of the stimuli is correct. This is at least some real progress :partying_face:

In the Begin Experiment tag I have:

shuffle = util.shuffle;
words=[''];
// Function to generate a random word
function generateRandomWord() {
  const vowels = ["a", "e", "i", "o", "u", "ü", "ö", "ä"];
  shuffle(vowels);
  const [v1, v2, v3] = vowels.slice(0, 3);

  const consonants = ["k", "t", "p", "m", "n", "s", "f", "r", "l"];
  shuffle(consonants);

  const [k1, k2, k3, k4, k5, k6] = consonants.slice(0, 6);

  return [k1 + v1 + k2, k4 + v1 + k2, k1 + v1 + k3, k1 + v2 + k2, k5 + v3 + k6];
}

// Function to generate a list of unique words, excluding certain words
function generateUniqueWords(excludeWords = []) {
    let words; // Declare the variable here

    do {
        words = generateRandomWord();
    } while (words.some(word => excludeWords.includes(word)));

    return words;
}

const excludeWords = ["can", "man", "tus", "kan", "net", "fom", "kam", "fan", "ken", "fat", "ton", "tom", "tim", "nam", "sun", "fuk", "top", "sam", "fük", "kif", "tun", "pun", "tum", "nit", "tik", "tuk", "tüp", "lit", "käs", "nim", "mik", "nut", "mus", "sum", "sin", "sit", "sat", "nas", "mop", "fap", "tip", "fon", "sik", "sup", "suf", "män", "men", "küs", "fat", "fät", "fun", "pan", "kim", "nil", "fak", "tan", "son", "not", "lik", "rip", "les", "las", "pur", "pul", "sim", "pin", "los", "lös", "rem", "ruf", "map", "kit", "rat"];

const numSets = 20;

const wordsDict = {};

for (var i = 1; i <= numSets; i++) {
    const words = generateUniqueWords(excludeWords);
    wordsDict[`initial_word_${i}`] = words[0];
    wordsDict[`rhyming_word_${i}`] = words[1];
    wordsDict[`same_onset_${i}`] = words[2];
    wordsDict[`different_vowel_${i}`] = words[3];
    wordsDict[`completely_different_${i}`] = words[4];
}

const initialWordsList = Array.from({ length: numSets }, (_, i) => wordsDict[`initial_word_${i + 1}`]);
const rhymingWordList = Array.from({ length: numSets }, (_, i) => wordsDict[`rhyming_word_${i + 1}`]);
const sameOnsetList = Array.from({ length: numSets }, (_, i) => wordsDict[`same_onset_${i + 1}`]);
const differentVowelList = Array.from({ length: numSets }, (_, i) => wordsDict[`different_vowel_${i + 1}`]);
const completelyDifferentList = Array.from({ length: numSets }, (_, i) => wordsDict[`completely_different_${i + 1}`]);

var pairRhyming1 = [initialWordsList[0], rhymingWordList[0]];
var pairRhyming2 = [initialWordsList[1], rhymingWordList[1]];
var pairRhyming3 = [initialWordsList[2], rhymingWordList[2]];
var pairRhyming4 = [initialWordsList[3], rhymingWordList[3]];
var pairRhyming5 = [initialWordsList[4], rhymingWordList[4]];

pairRhyming1.push("rhyme");
pairRhyming2.push("rhyme");
pairRhyming3.push("rhyme");
pairRhyming4.push("rhyme");
pairRhyming5.push("rhyme");

var pairOnset1 = [initialWordsList[5], sameOnsetList[5]];
var pairOnset2 = [initialWordsList[6], sameOnsetList[6]];
var pairOnset3 = [initialWordsList[7], sameOnsetList[7]];
var pairOnset4 = [initialWordsList[8], sameOnsetList[8]];
var pairOnset5 = [initialWordsList[9], sameOnsetList[9]];

pairOnset1.push("onset");
pairOnset2.push("onset");
pairOnset3.push("onset");
pairOnset4.push("onset");
pairOnset5.push("onset");

var pairDifferentVowel1 = [initialWordsList[10], differentVowelList[10]];
var pairDifferentVowel2 = [initialWordsList[11], differentVowelList[11]];
var pairDifferentVowel3 = [initialWordsList[12], differentVowelList[12]];
var pairDifferentVowel4 = [initialWordsList[13], differentVowelList[13]];
var pairDifferentVowel5 = [initialWordsList[14], differentVowelList[14]];

pairDifferentVowel1.push("different_vowel");
pairDifferentVowel2.push("different_vowel");
pairDifferentVowel3.push("different_vowel");
pairDifferentVowel4.push("different_vowel");
pairDifferentVowel5.push("different_vowel");

var pairCompletelyDifferent1 = [initialWordsList[15], completelyDifferentList[15]];
var pairCompletelyDifferent2 = [initialWordsList[16], completelyDifferentList[16]];
var pairCompletelyDifferent3 = [initialWordsList[17], completelyDifferentList[17]];
var pairCompletelyDifferent4 = [initialWordsList[18], completelyDifferentList[18]];
var pairCompletelyDifferent5 = [initialWordsList[19], completelyDifferentList[19]];

pairCompletelyDifferent1.push("completely_different");
pairCompletelyDifferent2.push("completely_different");
pairCompletelyDifferent3.push("completely_different");
pairCompletelyDifferent4.push("completely_different");
pairCompletelyDifferent5.push("completely_different");

pairCompletelyDifferent1.push("completely_different");
pairCompletelyDifferent2.push("completely_different");
pairCompletelyDifferent3.push("completely_different");
pairCompletelyDifferent4.push("completely_different");
pairCompletelyDifferent5.push("completely_different");

wordlist=[pairCompletelyDifferent1, pairCompletelyDifferent2, pairCompletelyDifferent3, pairCompletelyDifferent4, pairCompletelyDifferent5, pairRhyming1, pairRhyming2, pairRhyming3, pairRhyming4, pairRhyming5, pairOnset1, pairOnset2, pairOnset3, pairOnset4, pairOnset5, pairDifferentVowel1, pairDifferentVowel2, pairDifferentVowel3, pairDifferentVowel4, pairDifferentVowel5];
shuffle(wordlist);

And in Begin Routine:

positions = [[(- 0.4), (- 0.25)], [0.0, (- 0.25)], [0.4, (- 0.25)]];
shuffle(positions);
positiona = positions.shift();
positionb = positions.shift();
positionc = positions.shift();

words = wordlist.shift();
source = words[0];
target = words[1];
condition = words[2];
psychoJS.experiment.addData("source", source);
psychoJS.experiment.addData("target", target);
psychoJS.experiment.addData("condition", condition);

I tried to use auto components, but I always get translation errors :sweat_smile: The reason for using “let” is simply that ChatGPT helped me translating the code :sweat_smile: :sweat_smile:

I’m afraid I can’t debug JS code, but I can help with debugging Python that won’t translate.

1 Like

I’m nevertheless extremely happy that you are trying to help me! :blush: This is my Python code which works fine:

Begin Experiment:

def generate_random_word():
    vowels = ["a", "e", "i", "o", "u", "ü", "ö", "ä"]
    shuffle(vowels)
    v1, v2, v3 = vowels[:3]

    consonants = ["k", "t", "p", "m", "n", "s", "f", "r", "l"]
    shuffle(consonants)

    k1, k2, k3, k4, k5, k6 = consonants[:6]

    return k1 + v1 + k2, k4 + v1 + k2, k1 + v1 + k3, k1 + v2 + k2, k5 + v3 + k6

def generate_unique_words(exclude_words=[]):
    words = generate_random_word()

    while any(word in exclude_words for word in words):
        words = generate_random_word()

    return words

# Generate and store words in variables with names like initial_word_1, initial_word_2, etc.
exclude_words = ["can", "man", "tus", "kan", "net", "fom", "kam", "fan", "ken", "fat", "ton", "tom", "tim", "nam", "sun", "fuk", "top", "sam", "fük", "kif", "tun", "pun", "tum", "nit", "tik", "tuk", "tüp", "lit", "käs", "nim", "mik", "nut", "mus", "sum", "sin", "sit", "sat", "nas", "mop", "fap", "tip", "fon", "sik", "sup", "suf", "män", "men", "küs", "fat", "fät", "fun", "pan", "kim", "nil", "fak", "tan", "son", "not", "lik", "rip", "les", "las", "pur", "pul", "sim", "pin", "los", "lös", "rem", "ruf", "map", "kit", "rat"]

num_sets = 20  # Change this to the desired number of sets

words_dict = {}  # Dictionary to store the words

for i in range(1, num_sets + 1):
    words = generate_unique_words(exclude_words)
    words_dict[f"initial_word_{i}"] = words[0]
    words_dict[f"rhyming_word_{i}"] = words[1]
    words_dict[f"same_onset_{i}"] = words[2]
    words_dict[f"different_vowel_{i}"] = words[3]
    words_dict[f"completely_different_{i}"] = words[4]
    


initial_words_list = [words_dict[f"initial_word_{i}"] for i in range(1, num_sets + 1)]

rhyming_word_list = [words_dict[f"rhyming_word_{i}"] for i in range(1, num_sets + 1)]

same_onset_list = [words_dict[f"same_onset_{i}"] for i in range(1, num_sets + 1)]

different_vowel_list = [words_dict[f"different_vowel_{i}"] for i in range(1, num_sets + 1)]

completely_different_list = [words_dict[f"completely_different_{i}"] for i in range(1, num_sets + 1)]


pair_rhyming_1 = [initial_words_list[0]] + [rhyming_word_list[0]]
pair_rhyming_2 = [initial_words_list[1]] + [rhyming_word_list[1]]
pair_rhyming_3 = [initial_words_list[2]] + [rhyming_word_list[2]]
pair_rhyming_4 = [initial_words_list[3]] + [rhyming_word_list[3]]
pair_rhyming_5 = [initial_words_list[4]] + [rhyming_word_list[4]]

pair_rhyming_1.append("rhyme") 
pair_rhyming_2.append("rhyme") 
pair_rhyming_3.append("rhyme") 
pair_rhyming_4.append("rhyme") 
pair_rhyming_5.append("rhyme") 

pair_onset_1 = [initial_words_list[5]] + [same_onset_list[5]]
pair_onset_2 = [initial_words_list[6]] + [same_onset_list[6]]
pair_onset_3 = [initial_words_list[7]] + [same_onset_list[7]]
pair_onset_4 = [initial_words_list[8]] + [same_onset_list[8]]
pair_onset_5 = [initial_words_list[9]] + [same_onset_list[9]]

pair_onset_1.append("onset") 
pair_onset_2.append("onset") 
pair_onset_3.append("onset") 
pair_onset_4.append("onset") 
pair_onset_5.append("onset") 

pair_different_vowel_1 = [initial_words_list[10]] + [different_vowel_list[10]]
pair_different_vowel_2 = [initial_words_list[11]] + [different_vowel_list[11]]
pair_different_vowel_3 = [initial_words_list[12]] + [different_vowel_list[12]]
pair_different_vowel_4 = [initial_words_list[13]] + [different_vowel_list[13]]
pair_different_vowel_5 = [initial_words_list[14]] + [different_vowel_list[14]]

pair_different_vowel_1.append("different_vowel") 
pair_different_vowel_2.append("different_vowel") 
pair_different_vowel_3.append("different_vowel") 
pair_different_vowel_4.append("different_vowel") 
pair_different_vowel_5.append("different_vowel") 

pair_completely_different_1 = [initial_words_list[15]] + [completely_different_list[15]]
pair_completely_different_2 = [initial_words_list[16]] + [completely_different_list[16]]
pair_completely_different_3 = [initial_words_list[17]] + [completely_different_list[17]]
pair_completely_different_4 = [initial_words_list[18]] + [completely_different_list[18]]
pair_completely_different_5 = [initial_words_list[19]] + [completely_different_list[19]]

pair_completely_different_1.append("completely_different") 
pair_completely_different_2.append("completely_different") 
pair_completely_different_3.append("completely_different") 
pair_completely_different_4.append("completely_different") 
pair_completely_different_5.append("completely_different") 



wordlist = []


shuffle(wordlist)

The two parts which cannot be translated are:

def generate_unique_words(exclude_words=[]):
    words = generate_random_word()

    while any(word in exclude_words for word in words):
        words = generate_random_word()

    return words


and

wordlist.extend(value for name, value in locals().items() if name.startswith('pair_'))

Begin Routine:

#shuffle positions:

positions = [[-0.4, -0.25], [0.0, -0.25],[0.4, -0.25]]
shuffle(positions)
positiona = positions.pop()
positionb = positions.pop()
positionc = positions.pop()


#take out pseudowords
words = wordlist.pop()

source = words[0]
target = words[1]
condition = words[2]

thisExp.addData('source',source)
thisExp.addData('target',target)
thisExp.addData('condition',condition)

Okay, everything works fine now without changing the code. Somehow all changes I made were not synchronized. I created several versions of the experiment (locally) and at some point I realized that my changes were not shipped to Pavlovia. I then deleted all the invisible .git files which were created and then everything started to work smoothly :partying_face:

Thanks for your support wakecarter! :blush:

2 Likes

Great, that you found a solution! Can you please now click the solution box to close the thread so others looking for a solution can find it? Much appreciated. :slight_smile:

1 Like