2013-09-02 2 views
-5

Процедура получит список, содержащий списки разных типов, но однородные (различные типы элементов). Цель состоит в том, чтобы возвращать список, содержащий те же списки, отсортированные по типу с помощью следующей иерархии:Заказать список по типу в Racket?

1.Booleans

2.Numbers

3.Simbols

4.Funcitions

5.Strings

Например, это будет вход:

> (define (list (list (list (list (list (list (list (list (list (list 
    list 
    "z" "y" "x") 
    1 2 3) 
    "w" "v" "u") (lambda(x) x)) 
    'a 'b 'c) 
    4 5 6) 
    #f #t) 
    (lambda(x) (+ x x))) #f #t) 
    'd 'e 'f))) 

выход:

(порядка по-типа список) ((#f #t) (#f #t) (1 2 3) (4 5 6) (ABC) (DEF) (#) (#) (ZYX) (WVU))

Любая идея о том, как ПОДХОД эту задачу?

ответ

3

Ваш тестовый список и вывод примера не имеют смысла. Я использовал ваше объяснение в качестве основы для этого ответа:

#lang racket 

;;; This works as standard r6rs too with replaceing the above line with 
;;; #!r6rs 
;;; (import (rnrs base) 
;;;   (rnrs sorting)) 
;;; (define (sort lst <) 
;;;  (list-sort < lst)) 


;;; custom way of comparing two lists of homogeneous elements 
(define (compare-list-elements-by-type-index< x y) 
    ;; get a weight based on type.. NB: Need to add moe types if needed 
    (define (type-index x) 
    (cond ((boolean? x) 0) 
      ((number? x) 1) 
      ((symbol? x) 2) 
      ((procedure? x) 3) 
      ((string? x) 4) 
      ((list? x)  5) 
      ((pair? x)  6) 
      (else   7))) 

    ;; expect every element to be list or else this will fail 
    (< (type-index (car x)) (type-index (car y)))) 

;;; test-list 
(define list-of-list-of-same-elements `(("row" "your" "boat") 
             (a b c) 
             (#t #t #f) 
             (1 3 4) 
             ((1) (2) (3)) 
             (,+ ,-) 
             ("gently" "down" "the stream"))) 

;;; use native sort using our supplied out custom comparison procedure 
(sort list-of-list-of-same-elements compare-list-elements-by-type-index<) 

;;;==> '((#t #t #f) 
;;;  (1 3 4) 
;;;  (a b c) 
;;;  (#<procedure:+> #<procedure:->) 
;;;  ("row" "your" "boat") 
;;;  ("gently" "down" "the stream") 
;;;  ((1) (2) (3)))