Реферат (дубликат?) поведения между "родом" и "заменить"


Я написал эти две функции, которые имеют подобный процесс. Первая предназначена для "разделения" строку на данного персонажа, а вторая призвана "заменить все" экземпляры символа в заданной строке. Поведение между двумя, кажется, очень похожи - можно ли придумать хороший способ абстрагироваться, что поведение в-третьих, многоразовые, функция? (который может быть выполнен по телефону, например, (где-нашли искали-письмо searchee-нить вещь-до-до)).

(defun split (separator splittee)
  (let ((next-index (position separator splittee)))
    (if next-index
      (cons (subseq splittee 0 next-index) (split separator (subseq splittee (1+ next-index))))
      (list splittee))))

(defun replace-all (replacand replacee replacor)
  (let ((next-index (position replacand replacee)))
    (if next-index
      (concatenate 'string (subseq replacee 0 next-index) replacor (replace-all replacand (subseq replacee (1+ next-index)) replacor))
      replacee)))

Что вы думаете? Это лучше, чем исходный код, или это слишком сложно?

(defun where-found (sought-letter the-string to-do-onroute to-do-on-leaf)
  (let ((next-index (position sought-letter the-string)))
    (if next-index
      (apply to-do-onroute
         (list (subseq the-string 0 next-index) 
           (subseq the-string (1+ next-index))))
      (apply to-do-on-leaf (list the-string))))) 

(defun split (separator splittee)
  (where-found separator splittee 
           (lambda (pre-string post-string) (cons pre-string (split separator post-string))) 
           (lambda (leaf-string) (list leaf-string))))

(defun replace-all (to-be-replaced-string the-patient-string the-replacement-string)
  (where-found to-be-replaced-string the-patient-string 
           (lambda (pre-string post-string) 
         (format t "pre: ~a post: ~a the-replacement-string: ~a ~%" pre-string post-string the-replacement-string) 
         (concatenate 'string pre-string the-replacement-string (replace-all to-be-replaced-string post-string the-replacement-string)))
           (lambda (leaf-string) leaf-string)))

(format t "the cat is here: ~a ~%" (replace-all #\Space "the cat is here" ""))
(format t "the cat is here: ~a ~%" (split #\Space "the cat is here"))


411
2
задан 14 марта 2011 в 04:03 Источник Поделиться
Комментарии
1 ответ

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

Моя первая идея была, чтобы просто объединить разделена список деталей на замену-все – для вас могу сделать (конкатенация строки seqs ... ) – но это не может быть очень эффективным.

Вы можете использовать карту или петли для замены-все. Эта версия Карта тоже работает для списков:


(сайт defun заменяющие (далее из)
(карта (тип сл) (лямбда (тип char) (если (равен от чар) к char)) далее))

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

Есть утилита-библиотека называется сплит-последовательность, которая имеет много полезных опций, как


  • удалить пустые подпоследовательностей

  • только сплит count раз

  • возвращает позицию индекса (полезно для дальнейшей переработки)

Я еще учусь сюсюкаться, так что вы можете услышать, увидеть другие ответы.

2
ответ дан 15 марта 2011 в 04:03 Источник Поделиться