Операции списка в Lisp

Присвоения не являются выражениями в Kotlin, поэтому вам нужно сделать это снаружи:

var a: Int? = 1
var b: Int? = 2
var c: Int? = 1

a = b
if (a != c)
    print(true)

Для вашего другого примера с InputStream вы могли бы сделать:

fun readFile(path: String) {
    val input: InputStream = FileInputStream(path)
    input.reader().forEachLine {
        print(it)
    }
}

7
задан Jeremy Banks 9 February 2019 в 20:26
поделиться

6 ответов

Можно использовать setf и nth заменять и получать значения индексом.

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

(1 2 3 4 101 6)

Для нахождения индексом, можно использовать position функция.

(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)

Я нашел их все в этом индексе функций.

23
ответ дан 6 December 2019 в 04:51
поделиться
  1. найдите индекс чего-то в списке.

В Lisp Emacs и языке Common LISP, Вы имеете position функция:

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

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

(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 как CLOS.

Если Вы изучаете Lisp, удостоверьтесь, что Вы взглянули на Практический язык Common LISP и / или Маленький Интриган.

Удачи!

11
ответ дан 6 December 2019 в 04:51
поделиться

Ответы:

  1. (последовательность объекта положения &key от конца (запускаются 0) тестовый тест клавиши End - не),
    http://lispdoc.com/?q=position&search=Basic+search

  2. (setf (elt упорядочивают индекс) значение),

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

7
ответ дан 6 December 2019 в 04:51
поделиться

Ответы Jeremy должны работать; но это сказало при нахождении себя написанием кода как

(setf (энный я мой-список) новый-elt)

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

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

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

(defun (setf my-attr) (new list)
  (setf (nth 4 list) new))
4
ответ дан 6 December 2019 в 04:51
поделиться

+2 для "Практического языка Common LISP". Это - смесь Поваренной книги языка Common LISP, и качество Преподают Себе книгу Lisp.

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

Я также считал "язык Common LISP ANSI Paul Graham", который является больше об основах языка, но немного большем количестве справочника.

4
ответ дан 6 December 2019 в 04:51
поделиться

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

0
ответ дан 6 December 2019 в 04:51
поделиться
Другие вопросы по тегам:

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