2016-10-29 9 views
0

Проблемы

Я пытаюсь преобразовать следующий фрагмент кода: https://github.com/mdn/webgl-examples/blob/gh-pages/tutorial/glUtils.js#L13-L15Clourescript: преобразование доступа к массиву

Код JavaScript является:

Matrix.Translation = function (v) 
{ 
    // ignore length 2 case for simplicty 

    if (v.elements.length == 3) { 
    var r = Matrix.I(4); 
    r.elements[0][3] = v.elements[0]; 
    r.elements[1][3] = v.elements[1]; 
    r.elements[2][3] = v.elements[2]; 
    return r; 
    } 

    throw "Invalid length for Translation"; 
} 

Теперь я могу переписать его cljs следующим образом :

(defn translation [x y z] 
    (let [r (. js/Matrix I 4)] 
    r[0][3] = x ;; how do I write this? 
    r[1][3] = y ;; how do I write this? 
    r[2][3] = z ;; how do I write this? 
)) 

Вопрос

Однако как написать r [0] [3] в cljs?

ответ

1

Вы можете использовать aget и aset работать с JavaScript-массивы:

(def arr (array (array "a1" "a2") (array "b1" "b2") (array "c1" "c2"))) 

Это создает следующий вложенный массив:

#js [#js ["a1" "a2"] #js ["b1" "b2"] #js ["c1" "c2"]] 

Вы можете получить доступ вложенные элементы с aget:

(aget arr 1 0) 
;; => "b1" 

И обновить с помощью aset:

(aset arr 1 0 "newb1") 

обновления arr для:

#js [#js ["a1" "a2"] #js ["newb1" "b2"] #js ["c1" "c2"]] 

Вы можете взглянуть на другие функции, связанные с JavaScript-массивы: alength, array, make-array, array?.