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? Перевести полученный ответ в переменную и работать с ней, или сразу же работать с ответом? Строить абстракцию на уровне процедур?