Почему Схема не поддерживает среды первого класса?

Вариант 1. Использование пользовательского компаратора

Если вы хотите отсортировать массив Pet pets, вы можете использовать Array.sort () и предоставить Comparator :

Arrays.sort(pets, Comparator.comparing(Pet::getWeight).thenComparing(Pet::getHeight));

Я предполагал, что у вас есть добытчики веса и роста.
Сортируйте ваш массив от самых легких до самых тяжелых и от самых маленьких до самых высоких, если два питомца имеют одинаковый вес.

Вы можете вызвать его в своем Pets конструкторе:

public Pets(Pet[] pets){
    Arrays.sort(pets, ...);
    this.pets = pets;
}

Вариант 2: Реализация сопоставимого интерфейса

В качестве альтернативы, вы можете изменить свой класс для реализации Сравним и реализуем метод CompareTo ():

public class Pet implements Comparable{

    ...

    @Override
    public int compareTo(Pet o) {
        int result = Integer.compare(this.height, o.height);
        if(result != 0) return result;
        else return Integer.compare(this.weight, o.weight);
    } 
}

Тогда вы можете просто позвонить:

Arrays.sort(pets)
18
задан Eli Barzilay 8 June 2010 в 21:53
поделиться

4 ответа

После большего количества рытья вокруг я обнаружил этот информативный поток на newsnet:

"ОЦЕНКА R5RS и спецификаторы среды являются компромиссом между теми, кто глубоко не любит первоклассные среды и хочет ограниченную ОЦЕНКУ, и теми, кто не может принять/понять ОЦЕНКУ без второго аргумента, который является средой".

кроме того, нашел это "обходное решение":

(define-syntax make-environment 
  (syntax-rules () 
    ((_ definition ...) 
     (let ((environment (scheme-report-environment 5))) 
       (eval '(begin definition 
                     ...) 
             environment) 
       environment)))) 


(define arctic 
  (make-environment 
    (define animal 'polarbaer))) 

(взятый от это )

Однако я закончил тем, что принял вид стиля "передачи сообщений" подобных первый предложенный парень - я возвращаю alist функций и имею дженерик, "отправляют" метод за вызовом конкретной функции по имени..., т.е. что-то вроде этого

(define multiply
  (list
    (cons 'differentiate (...))
    (cons 'evaluate (lambda (args) (apply * args)))))

(define lookup
  (lambda (name dict)
    (cdr (assoc name dict))))

; Lookup the method on the object and invoke it
(define send
  (lambda (method arg args)
    ((lookup method arg) args))

((send 'evaluate multiply) args)

я читал далее, и знает, что существуют все CLOS, если я действительно хотел принять полностью стиль OO - но я думаю даже выше, несколько излишество.

13
ответ дан 30 November 2019 в 08:48
поделиться

Схема не имеет никаких первоклассных сред из-за причин производительности. Когда Схема была создана, это не был самый быстрый язык вокруг должного к изящному материалу как первоклассные функции, продолжения, и т.д. Добавление первоклассных сред нанесло бы вред производительности еще больше. Таким образом, это был компромисс, сделанный в ранние дни Схемы.

4
ответ дан 30 November 2019 в 08:48
поделиться

Классический диспетчер функционировал бы работа? Я думаю, что это подобно тому, что Вы ищете.

(define (scientific-library f)
  (define (scientific-square-root x) (some-scientific-square-root x))
  (cond ((eq? f 'square-root) scientific-square-root)
        (else (error "no such function" f))))
(define (fast-library f)
  (define (fast-square-root x) (some-fast-square-root x))
  (cond ((eq? f 'square-root) fast-square-root)
        (else (error "no such function" f))))

((scientific-library 'square-root) 23)
((fast-library 'square-root) 23)

Вы могли даже объединить пример научные и быстрые библиотеки в один большой метод отправки:

(define (library l f)
  (define (scientific-library f)
    ...)
  (define (fast-library f)
    ...)
  (cond ((eq? l 'scientific) (scientific-library f))
        ((eq? l 'fast) (fast-library f))
        (else (error "no such library" l))))
(library 'fast 'square-root)
1
ответ дан 30 November 2019 в 08:48
поделиться

Они написали это, потому что схема MIT, на самом деле, иметь первоклассные среды, и предположительно это то, что писатели планируют научить их классу (так как книга была написана в MIT).

Проверьте http://groups.csail.mit.edu/mac/projects/scheMe/

Однако я заметил, что схема MIT, пока все еще несколько активно развивалась, не хватает многих функций Что будет иметь действительно современную схему, как интерфейс иностранных функций или поддержка GUI. Вы, вероятно, не хотели бы использовать его для серьезного проекта разработки программного обеспечения, по крайней мере, не сам по себе.

4
ответ дан 30 November 2019 в 08:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: