(vl-load-com

; Przykładowe dane do testowania
(setq Dane (list (list 2 "Grzegorz" "Brzęczyszczykiewicz" "Chrząszczyrzewoszyce")
(list 1 "Józef" "Szwejk" "Praga")
 (list 3 "Władysław" "Kargul" "Krużewniki" )
 (list 0 "Kazimierz" "Pawlak" "Krużewniki" )
(list 5 "Jan" "Kania" "Kraków")
(list 4 "Moryc" "Haber" "Wiedeń" )
(list 6 "Hudej" "ich weiss nicht" "Praga")
))

(defun C:Sort ( / resp Sorted )
;----------------------------------------------------------
; funkcja sortuje elementy dwópoziomowej listy względem kryterium wybranego przez Użytkownika
; Argumenty: Dane: Lista list zawierających wartości liczbowe i tekstowe
; Wynik: nil
;----------------------------------------------------------

(setq resp(GetOption "Numer Imię nAzwisko Miejsce" (strcat "\n" "Wybierz kryterium" ":Numer/Imię/nAzwisko/Miejsce:") )) ; Wybór kryterium sortowania
(setq resp(cond ((= resp "NUMER") 0)((= resp "IMIĘ") 1)((= resp "NAZWISKO") 2) ((= resp "MIEJSCE") 3)))
(setq Sorted(vl-sort Dane '(lambda (%1 %2)(< (nth resp %1) (nth resp %2) ) ) ) )
(LISTprint Sorted )
nil
)

(defun LISTprint (Lista / %)
;----------------------------------------------------------
; funkcja wyświetla listę wiersz po wierszu
; Argumenty: Lista list zawierających wartości liczbowe i tekstowe
; Wynik: nil
;----------------------------------------------------------
(print Lista )
(foreach % Lista
(print % )
)
)

(defun GetOption (InitStr KWordStr / Wynik ans )
(setq Wynik nil)
(initget 1 InitStr )
(setq ans(vl-catch-all-apply 'getkword (list KWordStr )))
(if (not(vl-catch-all-error-p ans))
(progn
(if ans (progn
(setq Wynik (strcase ans))
))
)
)
Wynik
)

br /

; Sortowanie list wedłóg określonego elementu

(vl-load-com)

; Przykładowe dane do testowania
(setq Dane (list (list 2 "Grzegorz" "Brzęczyszczykiewicz" "Chrząszczyrzewoszyce")
(list 1 "Józef" "Szwejk" "Praga")
(list 3 "Władysław" "Kargul" "Lubomierz" )
(list 0 "Kazimierz" "Pawlak" "Lubomierz" )
(list 5 "Jan" "Kania" "Kraków")
(list 4 "Moryc" "Haber" "Wiedeń" )
(list 6 "Hudej" "ich weiss nicht" "Praga")
))

(defun C:Sort ( / resp Sorted )
;----------------------------------------------------------
; funkcja sortuje elementy dwópoziomowej listy względem kryterium wybranego przez Użytkownika
; Argumenty: Dane: Lista list zawierających wartości liczbowe i tekstowe
; Wynik: nil
;----------------------------------------------------------

(setq resp(GetOption "Numer Imię nAzwisko Miejsce" (strcat "\n" "Wybierz kryterium" ":Numer/Imię/nAzwisko/Miejsce:") )) ; Wybór kryterium sortowania
(setq resp(cond ((= resp "NUMER") 0)((= resp "IMIĘ") 1)((= resp "NAZWISKO") 2) ((= resp "MIEJSCE") 3)))
(setq Sorted(vl-sort Dane '(lambda (%1 %2)(< (nth resp %1) (nth resp %2) ) ) ) )
(LISTprint Sorted )
nil
)

(defun LISTprint (Lista / %)
;----------------------------------------------------------
; funkcja wyświetla listę wiersz po wierszu
; Argumenty: Lista list zawierających wartości liczbowe i tekstowe
; Wynik: nil
;----------------------------------------------------------
(print Lista )
(foreach % Lista
(print % )
)
)

(defun GetOption (InitStr KWordStr / Wynik ans )
(setq Wynik nil)
(initget 1 InitStr )
(setq ans(vl-catch-all-apply 'getkword (list KWordStr )))
(if (not(vl-catch-all-error-p ans))
(progn
(if ans (progn
(setq Wynik (strcase ans))
))
)
)
Wynik
)