некоторые стратегии для реорганизации моего кода Common Lisp

Предполагая, var friend = { firstName: 'Harry', lastName: 'Potter' };

Есть два варианта:

Обновление модели в памяти и сохранение (простой javascript array.push):

person.friends.push(friend);
person.save(done);

или

PersonModel.update(
    { _id: person._id }, 
    { $push: { friends: friend } },
    done
);

Я всегда стараюсь и выбираю первый вариант, когда это возможно, потому что он будет уважать больше преимуществ, которые дает вам мангуст (крючки, проверка и т. д.), ,

Однако, если вы делаете много одновременных записей, вы столкнетесь с условиями гонки, в результате чего вы столкнетесь с неприятными ошибками версий, чтобы остановить вас от замены всей модели каждый раз и потерять предыдущего добавленного вами друга , Так что только переходите к последнему, когда это абсолютно необходимо.

1
задан eyllanesc 14 July 2018 в 02:01
поделиться

2 ответа

  1. Некоторая документация делает большее улучшение, чем рефакторинг.
  2. Ваш макрос -> путает вывод типа sbcl. Вы должны (-> x) развернуть x и (-> x y...) на (let (($ x)) (-> y...))
  3. . Вы должны научиться использовать loop и использовать его в большем количестве мест. dolist с дополнительной мутацией невелик
  4. Во многих местах вы должны использовать destructuring-bind вместо, например, (rest (rest )). Вы также несовместимы, поскольку иногда вы пишете (cddr...) для этого.
  5. Ваш block* страдает множеством проблем: он использует (let (foo) (setf foo...)), который вытаскивает вывод типа sbcl. Имя block* подразумевает, что различные привязки привязаны таким образом, что они могут ссылаться на те ранее определенные вещи, но на самом деле все начальное значение может относиться к любому имени переменной или функции, и если эта переменная не была инициализирована, то она оценивает значение nil ,
  6. Стиль определения множества функций внутри другой функции, когда они могут быть снаружи, более типичен для схемы (которая имеет синтаксис для нее), чем Common Lisp.
  7. get-x-y-and-z-ranges действительно нужен использовать loop. Я думаю, что это тоже неправильно: списки имеют разные длины.
  8. Вам нужно определить некоторые функции доступа, а не использовать first и т. Д. Возможно, даже структура (!) [/ ​​G9]
  9. (sort foo) может уничтожить foo. Вам нужно сделать (setf foo (sort foo)).
  10. В принципе нет причин использовать do. Используйте loop.
  11. Вы должны, вероятно, использовать :key в нескольких местах.
  12. Вы пишете defvar, но я думаю, что вы имеете в виду defparameter
  13. *t* - глупое имя
  14. Большинство имен плохие и, похоже, не говорят мне, что происходит.
  15. Я могу быть идиотом, но не могу сказать что делает ваша программа. Вероятно, это может быть связано с большой работой
2
ответ дан Dan Robertson 17 August 2018 в 12:06
поделиться
  • 1
    Дэн, спасибо за ваш полезный совет. Я позже обновлю свой код и свяжу его снова. – Haruo Wakakusa 14 July 2018 в 04:09
  • 2
    В пункте 2, пожалуйста, покажите мне исходный URL-адрес руководства SBCL. Я знаю идентификатор & quot; - & gt; & quot; используется для синтаксиса контракта в Racket. – Haruo Wakakusa 14 July 2018 в 05:42

Возьмем, к примеру, get-x-depth-for-yz-grid.

(defun get-x-depth-for-yz-grid (planes//yz-plane grid)
  (let ((planes (get-planes-including-yz-grid-in planes//yz-plane grid)))
    (unless (evenp (length planes))
      (error "error in get-x-depth-for-yz-grid"))
    (sort planes (lambda (p1 p2) (< (caar p1) (caar p2))))
    (do* ((rest planes (cddr rest)) (res 0))
         ((null rest) res)
      (incf res (- (caar (second rest)) (caar (first rest)))))))

style -> ERROR можно заменить ASSERT.

Возможная ошибка -> SORT может быть разрушительным -> убедитесь, что вы иметь свежий список. Если это уже свежо выделено get-planes-including-yz-grid-in, тогда нам это не нужно.

bug -> SORT возвращает отсортированный список. Сортированный список, возможно, не побочный эффект. -> использовать возвращаемое значение

style -> DO заменено на LOOP.

style -> значение CAAR нечеткое. Найдите лучшее имя или используйте другие структуры данных.

(defun get-x-depth-for-yz-grid (planes//yz-plane grid)
  (let ((planes (get-planes-including-yz-grid-in planes//yz-plane grid)))
    (assert (evenp (length planes)) (planes)
      "error in get-x-depth-for-yz-grid")
    (setf planes (sort (copy-list planes) #'< :key #'caar))
    (loop for (p1 p2) on planes by #'cddr
          sum (- (caar p2) (caar p1)))))
4
ответ дан Rainer Joswig 17 August 2018 в 12:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: