Size: a a a

2020 April 09

AP

Alex Peresmeshnik in Lisp Forever
Я во все тонкости loop пока не въехал, просто спрашиваю у знатоков
источник

LL

Lämppi Lütti in Lisp Forever
🤷‍♂
источник

LL

Lämppi Lütti in Lisp Forever
Я бы в хеш таблицу положил и просто дёргал поля
источник

AP

Alex Peresmeshnik in Lisp Forever
Lämppi Lütti
Я бы в хеш таблицу положил и просто дёргал поля
Ну конкретно в этом случае вполне можно и так. Но мне интересно "в общем" работа с данными - это пожалуй 70% времени писания программы.
источник

AP

Alex Peresmeshnik in Lisp Forever
А списки (и пары), я смотрю, крайне универсальная тема. В них можно впихнуть невпихуёмое. Поэтому интересно кто как наловчился ими жонглировать
источник

VM

Vyacheslav Mikushev in Lisp Forever
Зависит от того в каком списке json. plist или alist. Если alist, то используют assoc.
источник

VM

Vyacheslav Mikushev in Lisp Forever
Ну и небольшую обёртку, если вложенность большая.
источник

VM

Vyacheslav Mikushev in Lisp Forever
По крайней мере, я так делаю. 😁
источник

AP

Alex Peresmeshnik in Lisp Forever
Vyacheslav Mikushev
Зависит от того в каком списке json. plist или alist. Если alist, то используют assoc.
assoc да, но если вложенность большая? Под небольшой оберткой - это рекурсивно обходить все сравнивать? )
источник

AP

Alex Peresmeshnik in Lisp Forever
Просто думал может есть чего в коммонлисповом стандарте, не зря же там более 1.5к функций ))
источник

A

Aragaer in Lisp Forever
я через assoc делал когда игрался несколько лет назад
источник

AP

Alex Peresmeshnik in Lisp Forever
Aragaer
я через assoc делал когда игрался несколько лет назад
А сейчас?
источник

A

Aragaer in Lisp Forever
а сейчас этот код не работает, но когда я к нему вернусь, так и будет
источник

A

Aragaer in Lisp Forever
cl-json выдает alist
источник

VM

Vyacheslav Mikushev in Lisp Forever
(defun get-v (json &rest path)
 (loop
    for k in path
    for test = (etypecase k
   (string #'string=)
   (keyword #'eql))
    for v = (cdr (assoc k json :test test)) then (cdr (assoc k v :test test))
    while v
    finally (return v)))

(defun (setf get-v) (new json &rest path)
 (loop
    for k in path
    for test = (etypecase k
   (string #'string=)
   (keyword #'eql))
    for v = (let ((v (assoc k json :test test)))
       (unless v
  (rplacd json (cons (car json) (cdr json)))
  (rplaca json (cons k nil)))
       (assoc k json :test test))
    then (let ((v* (assoc k (cdr v) :test test)))
    (unless v*
      (push (cons k nil) (cdr v)))
    (assoc k (cdr v) :test test))
    finally (progn
       (setf (cdr v) new)
       (return json))))
источник

A

Aragaer in Lisp Forever
впрочем, в plist он тоже умеет и местами было plist удобнее
источник

VM

Vyacheslav Mikushev in Lisp Forever
И вот так можно использовать (get-v json :x :y).
источник

A

Aragaer in Lisp Forever
читать - alist, а писать лично мне было иногда удобнее plist, вот
источник

AP

Alex Peresmeshnik in Lisp Forever
Vyacheslav Mikushev
И вот так можно использовать (get-v json :x :y).
О, норм тема. Ща разберу loop
источник
2020 April 10

AP

Alex Peresmeshnik in Lisp Forever
источник