Как каждый знает когда к новой строке в Clojure/Lisp в целом?

Вот немного примера кода:

(deftype Deck52 [suits] :as this
  DeckOfCards
  (check-empty []
               (Deck52. (apply hash-map 
                              (apply concat (remove (-> nil?) 
                                                    (for [[key val] suits] 
                                                      (if (empty? val) nil [key val])))))))
  (remove-card [suit card]
               (assoc suits suit (remove #(= card %) (suit suits))))

  (get-card [suit]
            (let [suitd (suit suits)]
              [(first suitd) (check-empty (Deck52. (assoc suits suit (rest suitd))))]))

  (random-card []
               (let [suitn (+ 1 (rand-int 4))]
                 (cond (= suitn 1) (get-card this :hearts)
                       (= suitn 2) (get-card this :diamonds)
                       (= suitn 3) (get-card this :clubs)
                       (= suitn 4) (get-card this :spades)))))

Я также отправил этот код в Сути здесь, если легче читать: http://gist.github.com/307425 (не идущий нигде).

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

Так, вопрос, когда время это для размещения новой строки в код Clojure/Lisp? Я - 'doin' это обряд'?

Примечание: Я не могу обещать, что код отправил работы. Я делал некоторое экспериментирование, и некоторыми вещами мог бы быть простой sucky, если не поврежденный.

6
задан abatishchev 23 June 2010 в 09:54
поделиться

3 ответа

То, как вы разорвали линии, вполне нормально. Я бы сделал некоторые небольшие изменения.

  • Поместите векторы аргументов в следующую строку.
  • Используйте разные формы: маленькие -> и - >> помощники, condp, when, ...
  • При необходимости прервите строку сразу после имени функции .

Вот как я бы это сделал. (Отказ от ответственности: мой стиль. Ваш может быть другим. YMMV!)

(deftype Deck52 [suits] :as this
  DeckOfCards
  (check-empty
    []
    (->> (for [[key val] suits]
           (when-not (empty? val)
             [key val]))
      (remove nil?)
      (apply concat)
      (apply hash-map)
      Deck52.))
  (remove-card
    [suit card]
    (assoc suits suit (remove #(= card %) (suit suits))))
  (get-card
    [suit]
    (let [suitd (suit suits)]
      [(first suitd)
       (->> (rest suitd)
         (assoc suits suit)
         Deck52.
         check-empty)]))
  (random-card
    []
    (let [suitn (+ 1 (rand-int 4))]
      (condp = suitn
        1 (get-card this :hearts)
        2 (get-card this :diamonds)
        3 (get-card this :clubs)
        4 (get-card this :spades)))))

Хотя следующее не является частью вашего вопроса, я не могу устоять:

(deftype Deck52 [suits] :as this
  DeckOfCards
  (check-empty
    []
    (->> suits (remove (comp nil? seq val)) (into {}) Deck52.))
  (remove-card
    [suit card]
    (update-in suits [suit] #(remove %2 %1) #(= card %)))
  (get-card
    [suit]
    (let [suitd (get suits suit)]
      [(first suitd)
       (->> (rest suitd) (assoc suits suit) Deck52. check-empty)]))
  (random-card
    []
    (case (rand-int 4)
      0 (get-card this :hearts)
      1 (get-card this :diamonds)
      2 (get-card this :clubs)
      3 (get-card this :spades))))
7
ответ дан 10 December 2019 в 00:37
поделиться

"Android-Way" (если это только два уровня иерархии) будет использовать ExpandureListView . Это можно найти в демонстрационном проекте API.

Чтобы реализовать что-то действительно идентичное поведению iPhone, я уверен, вы должны пройти тяжелый путь реализации этого самостоятельно.

  • Вариант A: реализуйте отдельные действия для каждого уровня иерархии (возможно, используя ListActivities) и продавливайте данные туда вручную
  • Вариант B: может быть, можно реализовать скольжение внутри и из данных через Downder . Я не уверен, что не использовал его до сих пор.

Кажется, трудно реализовать это в Android. Посмотрим, что другие предложат!

-121--4407340-

Самый простой способ запустить cron через CodeIgniter - сделать URL cron доступным через ваше приложение.

Затем вызовите его через wget

wget -O - -q -t 1 http://www.example.com/cron/run

Внутри контроллера можно использовать журнал, чтобы убедиться, что cron не выполняется слишком часто, т.е. если роботы Google запускают его по ошибке.

Вторым методом было бы использование рыси

/usr/local/bin/lynx -source http://www.example.com/cron/run
-121--1728893-

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

(check-empty []
             (Deck52. 
              (apply 
               hash-map 
               (apply 
                concat 
                (remove 
                 (-> 
                  nil?) 
                  (for [[key val] suits] 
                   (if (empty? val) nil [key val])))))))
1
ответ дан 10 December 2019 в 00:37
поделиться

clojure-mode для Emacs не обязательно дает правильные отступы. Я говорю, старайтесь, чтобы длина ваших строк не превышала 80 символов, и будьте последовательны.

2
ответ дан 10 December 2019 в 00:37
поделиться
Другие вопросы по тегам:

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