Dlaczego nie możemy po prostu przekonwertować kodu Clojure do ciągów i wysłać go na TCP i ocenić po drugiej stronie (NRPL)?

Na przykład: jest to hashmap {"foo" "bar", 1 "spam"}, którego kodowanie BENCODE jest d3:foo3:bari1e4:spame.

Jeśli konwertujemy go na ciąg - & GT; {\"foo\" \"bar\", 1 \"spam\"}

I oceniaj po drugiej stronie zamiast używać BenCod, jak pokazano poniżej.

(eval (read-string "{\"foo\" \"bar\", 1 \"spam\"}"))
; ⇒ {"foo" "bar", 1 "spam"}

Jestem nowy w świecie Clojure. To może być głupie pytanie, ale w każdym razie.

1
npcoder2k14 4 styczeń 2020, 23:10

2 odpowiedzi

Najlepsza odpowiedź

Dla osób szukających odpowiedzi, przeczytaj sekcję # Motywację w https://github.com/clojure/tools.nrepl/blob/master/src/main/clojure/clojure/tools/nrepl/bence.clj .

Jest to bardzo dobrze napisane.

0
npcoder2k14 6 styczeń 2020, 13:45

Opiekun NRpl tutaj. Istnieje kilka powodów, dla których NRpl używa domyślnie BENCODE:

  • Potrzebowaliśmy formatu danych, który łatwo obsługuje strumieniowanie danych (nie znajdziesz wielu strumieniowych parserów JSON)
  • Potrzebowaliśmy formatu danych, który może być łatwo obsługiwany przez wielu klientów (wsparcie dla formatów takich jak JSON i EDN są trudne w redakcji, takich jak Emacs i Vim). Mogę ci powiedzieć, że cydr nie istniałby, jeśli 8 lat temu musieliśmy sobie poradzić z JSON. :-)
  • Bencode jest tak proste, że zwykle nie musisz nawet polegać na bibliotece trzecich (wielu klientów / serwerów posiada własną realizację kodowania / dekodowania w mniej niż 100 liniach kodu) - oznacza to, że klienci / serwery mają jedną mniejszą bibliotekę 3. Narzędzia takie jak NRPL nie mogą mieć czasu wykonawczego, ponieważ kolidują z aplikacją użytkownika deps.
  • Edn nie istniał, kiedy powstał NRpl

BTW, te dni Nplpl obsługuje również EDN i JSON (za pośrednictwem biblioteki fastlane), ale myślę, że Bencode jest nadal najlepszym transportem w większości przypadków.

1
Bozhidar Batsov 23 maj 2020, 05:48