Cum pot adăuga la un sistem alist în schemă?

Adăugarea unui element în capul unui alist (lista asociativă) este suficient de simplă:

> (cons '(ding . 53) '((foo . 42) (bar . 27)))
((ding . 53) (foo . 42) (bar . 27))

Adăugarea la coada unui alist este un pic mai complicat totuși. După unele experimentări, am produs acest lucru:

> (define (alist-append alist pair) `(,@alist ,pair))
> (alist-append '((foo . 42) (bar . 27)) '(ding . 53))
'((foo . 42) (bar . 27) (ding . 53))

Totuși, mi se pare că aceasta nu este soluția idiomatică. Deci, cum se procedează de obicei în schemă? Sau este chiar așa?

0
Deci eu sunt;) Serios, totuși, nu este străin așa cum apare; Are doar o sintaxă amuzantă. După un timp, nu mai observi amuzamentul. Sunt doar hobby-hacking cu schema, dar aproape că m-am obișnuit deja cu asta.
adăugat autor troelskn, sursa
Sunt înspăimântător de oameni care înțeleg limbi precum Schema
adăugat autor Danimal, sursa

1 răspunsuri

Common Lisp definește o funcție numită ACONS exact în acest scop, unde

(acons key value alist)

este echivalent cu:

(cons (cons key value) alist)

Acest lucru sugerează că simpla constatare a unui alist este idiomatică. Rețineți că aceasta înseamnă două lucruri:

  1. Deoarece căutările sunt efectuate de obicei din față în spate, asociațiile recent adăugate au prioritate față de cele vechi. Acest lucru poate fi folosit pentru o implementare naivă a ambelor medii lexicale și dinamice.
  2. În timp ce se află pe o listă este O (1), adăugarea este în general O (n) unde n este lungimea listei, astfel încât utilizarea idiomatică este cea mai bună pentru performanță și este preferabil stilistic.
0
adăugat