ракетка: эквивалентно np.zeros ((n, m))

1

Я не могу понять, что я делаю неправильно здесь. Может быть, неулокальный backquote.

Код ракетки:

(require math/array)
(define mask_cube
  (let ([leng 5])
    '(make-array #(,leng ,leng) 0)))

Что я хочу сделать, написанное на python:

np.zeros((5,5))

Почему запятая не работает, как мне кажется? Если есть более элегантный способ решить проблему, сообщите мне. В основном мне просто нужна моя красивая, короткая np.zeros()

Более того, если есть что-то фундаментальное, я недопонимаю о backquote, запятых или ракетке (или даже Lisp вообще), пожалуйста, дайте мне знать.

Теги:
numpy
lisp
racket

2 ответа

3
Лучший ответ

Вы не хотите, чтобы eval здесь. Скорее, вы цитируете слишком много; простое решение вашей проблемы - переместить ' внутрь" в нужное место:

(define mask_cube
  (let ([leng 5])
    (make-array '#(,leng ,leng) 0)))

Однако Id обычно избегает цитаты, если вы новичок; это сложнее, чем нужно. Просто используйте vector функцию, которая проще понять:

(define mask_cube
  (let ([leng 5])
    (make-array (vector leng leng) 0)))

Для углубленного рассмотрения цитаты (с квазикотацией в конце) см. В чем разница между цитатой и списком? ,

  • 0
    Мне нравится краткость обратной цитаты. Более того, раньше я немного пошутил, просто из практики. Спасибо за пересмотр!
-2

Вау, я чувствую себя глупо. Это всегда одно и то же: что оценивается по сравнению с тем, что только список символов. Ответ (см. eval):

(define mask_cube
  (let ([leng 5])
    (eval
      '(make-array #(,leng ,leng) 0))))

Все еще открыты для других ответов, которые кодируются с лучшим стилем и я np.zeros() изменить это в функцию/макрос, которая переводит np.zeros() и np.ones() в Lisp

  • 3
    В хорошем первом приближении, если вы используете eval вы делаете ошибку.
  • 1
    Интересно подумать, как бы вы сделали это в Python. Я думаю, что это eval("np.zeros([{}, {}])".format(5, 5) . Я думаю, это говорит о том, насколько ужасным является eval .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню