DrRacket - 使用 lambda 生成具有相同元素的列表

DrRacket - Using lambda to produce list that has the same element

刚接触racket,最近开始学习抽象列表函数。 我必须编写一个函数 (same-country airports code),它使用一个机场列表 airports 和一个代表机场的三字母代码。该函数生成一个列表,其中包含与给定机场具有相同国家/地区的所有机场代码,并按字母升序排序。 如果代码不在关联列表中,则该函数将生成空。

例如:

(define alist (list (list "YYZ" (list "Toronto" "Canada"))
                    (list "YWG" (list "Winnipeg" "Canada"))
                    (list "BGO" (list "Bergen" "Norway"))
                    (list "TRF" (list "Sandefjord" "Norway"))
                    (list "YUL" (list "Montreal" "Canada"))
                    (list "LHR" (list "London" "England"))
                    (list "YVR" (list "Vancouver" "Canada"))))

然后

(same-country alist "YUL") => (list "YUL" "YVR" "YWG" "YYZ")

谁能告诉我怎么做 problem/give 给我一个模板?在这个问题中我不允许使用任何命名的辅助函数,只有 lambda...我知道如何在使用显式递归时做到这一点,但我对抽象列表函数的理解不够好

版本 3

; please tell us which language you use (in front of code)
; please take effort before adding comment
; language:intermediate student with lambda
(define same-country-v2
  (λ (airport-ls airport-name)
    ((λ (ls name1 name2)
       ; result
       (sort
        (map (λ (p) (first p))
             (filter (λ (x)
                       (or (equal? name1 (first (second x)))
                           (equal? name2 (second (second x)))))
                     ls))
        string<=?))
     airport-ls
     ; city name
     (first ((λ (airports airport-name) (second (first (filter (λ (x) (equal? (first x) airport-name)) airports)))) airport-ls airport-name))
     (second ((λ (airports airport-name) (second (first (filter (λ (x) (equal? (first x) airport-name)) airports)))) airport-ls airport-name)))))

;;; TEST
(same-country-v2 airports "YUL")
(same-country-v2 airports "BGO")