2008-09-05 2 views
7

Я искал везде следующие функции в Лиспе, и не получили нигде:Могу ли я сделать это в Lisp?

  1. найти индекс что-то в списке. пример:

    (index-of item InThisList) 
    
  2. заменить что-то в определенном месте в списке. пример:

    (replace item InThisList AtThisIndex) ;i think this can be done with 'setf'? 
    
  3. возврат товара по определенному индексу. Пример:

    (return InThisList ItemAtThisIndex) 
    

Вплоть до этого момента, я уже притворяется со своими собственными функциями. Мне интересно, я просто создаю для себя больше работы.

Это, как я уже подделке номер 1:

(defun my-index (findMe mylist) 
    (let ((counter 0) (found 1)) 
    (dolist (item mylist) 
     (cond 
     ((eq item findMe) ;this works because 'eq' checks place in memory, 
        ;and as long as 'findMe' was from the original list, this will work. 
     (setq found nil) 
     (found (incf counter)))) 
    counter)) 

ответ

23

Я нуб себя, но вы можете использовать setf и nth сделать номер 2 и 3.

(let ((myList '(1 2 3 4 5 6))) 
    (setf (nth 4 myList) 101); <---- 
    myList) 

(1 2 3 4 101 6) 

Никакого понятия о первом.

EDIT: Для номер один вы можете использовать the position function. Ха.

(let ((myList '(1 2 3 4 5 6))) 
    (setf (nth 4 myList) 101) 
    (list myList (position 101 myList))) 

((1 2 3 4 101 6) 4) 

Я нашел их все in this index.

4

Ответы Джереми должны работать; но сказал, что если вы оказываетесь писать код как

(SEtF (п-го я мой-лист) новый-ELT)

вы, вероятно, используя неправильную структуру данных. Списки - это просто связанные списки, так что они O (N) для доступа по индексу. Возможно, вам лучше использовать массивы.

Возможно, вы используете списки как кортежи. В этом случае они должны быть в порядке. Но вы, вероятно, хотите назвать аксессоров, поэтому кто-то, читающий ваш код, не должен помнить, что означает «nth 4». Что-то вроде

(defun my-attr (list) 
    (nth 4 list)) 

(defun (setf my-attr) (new list) 
    (setf (nth 4 list) new)) 
+0

Кроме того, мы не «заменяем» элемент в списке. Мы копируем первые (r-1) элементы и помещаем новое значение в r, где cdr связан с элементом (r + 1) - поскольку мы имеем дело с постоянством. – nlucaroni 2008-09-10 15:55:34

0

Я должен согласиться с Томасом. Если вы используете списки, такие как массивы, тогда это будет медленным (и, возможно, неудобным). Поэтому вы должны либо использовать массивы, либо придерживаться написанных вами функций, но перемещать их «вверх» таким образом, чтобы вы могли легко заменить медленные списки массивами позже.

11
  1. найти индекс чего-то в списке.

В Emacs Lisp и Common Lisp, вы имеете position функцию:

> (setq numbers (list 1 2 3 4)) 
(1 2 3 4) 
> (position 3 numbers) 
2 

В схеме, вот хвост рекурсивная реализация от док DrScheme «s:

(define list-position 
    (lambda (o l) 
    (let loop ((i 0) (l l)) 
     (if (null? l) #f 
      (if (eqv? (car l) o) i 
       (loop (+ i 1) (cdr l))))))) 

---------------------------------------------------- 

> (define numbers (list 1 2 3 4)) 
> (list-position 3 numbers) 
2 
> 

Но если вы используете список в виде коллекции слотов для хранения структурированных данных, возможно, вам стоит взглянуть на defstruct или даже на какой-то Lisp O bject Система вроде CLOS.

Если вы изучаете Лисп, убедитесь, что вы смотрите на Practical Common Lisp и/или The Little Schemer.

Cheers!

7

Ответы:

  1. (позиция последовательности элемент & ключ от-конца (начало 0) конец ключа тест тест-не)
    http://lispdoc.com/?q=position&search=Basic+search

  2. ((ELT индекс последовательности) значение SETF)

  3. (ELT индекс последовательности)
    http://lispdoc.com/?q=elt&search=Basic+search
    Примечание: еи предпочтительнее NTH, потому что еи работает на любой последовательности, а не только списки

4

+2 для "Practical Common Lisp". Это смесь Common Lisp Cookbook и книги «Обучайте себя» Lisp.

Существует также «Успешный общий Лисп» (http://www.psg.com/~dlamkins/sl/cover.html и http://www.psg.com/~dlamkins/sl/contents.html), который, казалось, заполнил несколько пробелов/расширений в «Практическом общем Лиспе».

Я также прочитал «ANSI Common Lisp» от Пола Грэма, который больше касается основ языка, но немного больше справочного руководства.

Смежные вопросы