Заменить элемент в списке в Common Lisp?

Способ Javascript:

var language = window.navigator.userLanguage || window.navigator.language;//returns value like 'en-us'

Если вы используете плагин jQuery.i18n , вы можете использовать:

jQuery.i18n.browserLang();//returns value like '"en-US"'

23
задан Olie 5 August 2013 в 15:17
поделиться

10 ответов

быстро вы можете сделать это с помощью JS на list-replace

1
ответ дан Madil 5 August 2013 в 15:17
поделиться
(defun replace-nth-from-list  (list n elem)  
      (cond  
        ((null list) ())  
        (t (append (subseq list 0 n) elem (subseq list (+ 1 n)(length list))))))
-1
ответ дан Mehul Mistri 5 August 2013 в 15:17
поделиться

Звучит так, будто ты хочешь либо rplaca, либо заменить. См. http://www.lispworks.com/documentation/HyperSpec/Body/f_rplaca.htm или http://www.lispworks.com/documentation/HyperSpec/Body/f_replac.htm#. заменить

1
ответ дан David Plumpton 5 August 2013 в 15:17
поделиться

Как часто вы собираетесь это делать; если вы действительно хотите массив, вы должны использовать массив . В противном случае, да, функция, которая создает новый список, состоящий из копии первых N элементов, нового элемента и хвоста, будет в порядке. Я не знаю, какая встроенная функция у меня в голове, но я давно не программировал на Лиспе.

Вот решение в Схеме (потому что я знаю это лучше, чем Common Lisp, и у меня есть переводчик для проверки моей работы):

(define (replace-nth list n elem)
  (cond
    ((null? list) ())
    ((eq? n 0) (cons elem (cdr list)))
    (#t (cons (car list) (replace-nth (cdr list) (- n 1) elem)))))
8
ответ дан Community 5 August 2013 в 15:17
поделиться

Я просто пытаюсь исправить код Хаззена:

(define (replace-nth list n elem)
  (cond 
    ((null? list) ())
    ((eq? n 0) (cons elem list))
    (#t (cons(car list) (replace-nth (cdr list) (- n 1) elem)))))

> (replace-nth (list 3 2 9 2) 2 8)
(3 2 8 9 2)

Этот код вставил новый элемент в список. Если мы хотим заменить элемент:

(define (replace-nth list n elem)
  (cond 
    ((null? list) ())
    ((eq? n 0) (cons elem (cdr list)))
    (#t (cons(car list) (replace-nth (cdr list) (- n 1) elem)))))

> (replace-nth (list 3 2 9 2) 2 8)
(3 2 8 2)

0 < = n < = длина (список) - 1

4
ответ дан user25281 5 August 2013 в 15:17
поделиться

Используйте [ЗАМЕНЯЮТ] [1] (я использую X вместо Вашего T, поскольку T является истинным значением в Lisp):

(replace L (list X) :start1 N)

[1]: http://www.lispworks.com/documentation/HyperSpec/Body/f_replac.htm ЗАМЕНА

1
ответ дан 5 August 2013 в 15:17
поделиться
  • 1
    Я понимаю Ваш ответ, но я действительно очень не хотел бы получить рассылки от компании, всегда обращаемой как " Дорогой Colin Angus Mackay". любой " Привет Colin" если они хотят быть неофициальными, или " Уважаемый г-н Mackay" если они хотят быть формальными. И так или иначе, если Вы просите у людей их полное имя they' ll помещенное дерьмо так или иначе. У меня были делегаты на последней конференции, которую я выполнил с бейджами, которые читают " joe blow" (не правильно использованный для своей выгоды) или " Очень прикольный John" (который он был действительно смущен тем, когда он узнал что " name" поле было для!) – Colin Mackay 13 July 2009 в 22:32
(setf (nth N L) NEW)

должен добиться цели.

25
ответ дан Olie 5 August 2013 в 15:17
поделиться
  • 1
    Используйте автовыпуск если you' ve получил некоторую причину не к. Также можно использовать stringWithFormat, который уже дает Вам автовыпущенный объект. – Dan Rosenstark 27 January 2011 в 21:19

совет hazzen хорош (используйте массивы), так как Вы, вероятно, хотите сделать, много этих разрушительных обновлений и списков очень неэффективно наугад доступ. Самый легкий способ сделать это

(setq A (make-array 5) :initial-contents '(4 3 0 2 1))
(setf (elt 2 A) 'not-a-number)

, где A является массивом (хотя elt работы для любой последовательности).

Однако, если Вы должны быть функциональными, который является

  1. , Вы хотите иметь в наличии, и старые и новые списки
  2. Вы хотите, чтобы старое и новое совместно использовали как можно больше памяти.

Тогда необходимо использовать язык Common LISP, эквивалентный из кода hazzen:

(defun replace1 (list n elem)
  (cond
    ((null list) ())
    ((= n 0) (cons elem list))
    (t (cons (car list) (replace1 (cdr list) (1- n) elem)))))

Это выглядит медленным, потому что это, и это, вероятно, почему это не включено в стандарт.

код hazzen является версией Схемы, которая полезна, это - то, что Вы используете.

3
ответ дан Nathan Shively-Sanders 5 August 2013 в 15:17
поделиться

Очевидное решение является медленным и использует память, как отмечено другими. Если возможно, необходимо попытаться задержать замену элемента (элементов), пока Вы не должны выполнять другую поэлементную операцию в списке, например, (loop for x in list do ...).

Тот путь, Вы амортизируете далеко концентрирующий (память) и повторение (CPU).

0
ответ дан Mikael Jansson 5 August 2013 в 15:17
поделиться
  • 1
    Более, чем вероятный, или пользователь будет использовать базу данных в профессиональном контексте, или в персональном контексте - было бы необычно смешать два. Если они действительно хотят " personal" контекст даже при том, что они используют его профессионально также, тогда я предположил бы, что они будут или просто использовать профессиональное имя со знанием, что друзья будут использовать свое имя так или иначе, или просто иметь две учетных записи. – Arafangion 19 July 2009 в 23:45
(setf (nth N L) T)

самый ясный, самый сжатый, и самый быстрый путь, если то, что Вы хотите сделать, является "разрушительной" модификацией, т.е. на самом деле измените существующий список. Это не выделяет новой памяти.

6
ответ дан Dan Weinreb 5 August 2013 в 15:17
поделиться
  • 1
    @Abizern, почему? Вы волновались о памяти или производительности наверху? Пока мы не получаем ARC (который we' ре, уже входящее в iOS) или gc (как на MacOS), автовыпуск делает код намного более чистым почти ни с какими издержками. Если you' ре в длинном цикле, я (и многие другие люди, я могу процитировать это если you' d как), полагают, что автовыпуск предпочтителен. – Dan Rosenstark 21 July 2011 в 13:21
Другие вопросы по тегам:

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