picolisp
February 24, 2019

Получение и конвертация JSON через HTTPS на LISP (PicoLisp)

Изучаю LISP на диалекте PicoLisp.

В PicoLisp нет библиотеки https, это обусловлено философией самого языка, держать платформу максимально на "легке". И это мне понравилось.

Легко использовать внешнее приложение и распарсить полученный ответ.

https://rosettacode.org/wiki/HTTPS#PicoLisp

(in '(curl https://sourceforge.net) # Open a pipe to 'curl'
  (out NIL (echo)) )                 # Echo to standard output

По выше сказанной причине нет у нее и готовой библиотеки для работы с json, но это легко и изящно можно реализовать самому за менее 100 строк кода, это потрясающе!

https://rosettacode.org/wiki/JSON#PicoLisp

(de checkJson (X Item)
   (unless (= X Item)
      (quit "Bad JSON" Item) ) )
 
(de readJson ()
   (case (read "_")
      ("{"
         (make
            (for (X (readJson)  (not (= "}" X))  (readJson))
               (checkJson ":" (readJson))
               (link (cons X (readJson)))
               (T (= "}" (setq X (readJson))))
               (checkJson "," X) ) ) )
      ("["
         (make
            (link T)  # Array marker
            (for (X (readJson)  (not (= "]" X))  (readJson))
               (link X)
               (T (= "]" (setq X (readJson))))
               (checkJson "," X) ) ) )
      (T
         (let X @
            (cond
               ((pair X) (pack X))
               ((and (= "-" X) (format (peek)))
                  (- (read)) )
               (T X) ) ) ) ) )
 
(de printJson (Item)  # For simplicity, without indentation
   (cond
      ((atom Item) (if Item (print @) (prin "{}")))
      ((=T (car Item))
         (prin "[")
         (map
            '((X)
               (printJson (car X))
               (and (cdr X) (prin ", ")) )
            (cdr Item) )
         (prin "]") )
      (T
         (prin "{")
         (map
            '((X)
               (print (caar X))
               (prin ": ")
               (printJson (cdar X))
               (and (cdr X) (prin ", ")) )
            Item )
         (prin "}") ) ) )

Теперь задача, как это объединить?

Все элементарно:

 (in '(curl "https://api.telegram.org/botЧЧЧЧЧЧЧ:AAчччччччччччччччччччччч/getMe") 
   (readJson))
    

Как же правильно в Lisp? Перевести полученный ответ в переменную и работать с ней, или сразу же работать с ответом? Строить абстракцию на уровне процедур?