Могут ли массивы javascript имитировать списки lisp? реализация javascript версии функции накопления-n (упражнение SICP 2.36) - PullRequest
1 голос
/ 01 марта 2020

Я реализую javascript версию функции накопления-n (упражнение SICP 2.36) Однако, в отличие от схемы, javascript не имеет индикатора nil для массивов, что приводит к дополнительному «неопределенному» значению в выходном массиве. Должен ли я создать новую структуру данных "List", которая имитирует списки Scheme, или есть некоторые приемы, чтобы сделать это с помощью собственных массивов в javascript Вот код, над которым я работаю

const accumulate = (op, init, sequence) => Array.prototype.reduce.call(sequence, op, init)
const map = (fn, sequence) => Array.prototype.map.call(sequence, fn)
const concat = (A, B) => Array.prototype.concat.call([], A, B)
const sum = (a, b) => a + b
const first = (sequence) => {
    const [first, ...rest] = sequence
    return first
}
const rest = (sequence) => {
    const [first, ...rest] = sequence
    return rest;
}
const isEmpty = sequence => sequence.length === 0 
const accumulateN = (op, init, sequenceOfSequences) => {
    if(isEmpty(first(sequenceOfSequences))) return;
    return concat(accumulate(op, init, map(first, sequenceOfSequences)), accumulateN(op, init, map(rest, sequenceOfSequences))) 
}

log(accumulateN(sum, 0, [[1,2,3], [4,5,6], [5,6,7]]))           

//outputs [ 10, 13, 16, undefined ]


...