После написания:Сортировать функция с настраиваемой функцией Comparision
(define (sort-asc l)
(cond ((eq? l '()) '())
((eq? (cdr l) '()) (list (car l)))
((< (car l) (cadr l)) (cons (car l) (sort-asc (cdr l))))
(else (cons (cadr l) (sort-asc (cons (car l) (cddr l)))))))
Как вы пишете функцию, которая может дополнительно принимать функцию сравнения в качестве параметра?
Пробовал:
(define (sort-f l f)
(cond ((eq? l '()) '())
((eq? (cdr l) '()) (list (car l)))
((lambda()(f (car l) (cadr l))) (cons (car l) (sort-f (cdr l) f)))
(else (cons (cadr l) (sort-f (cons (car l) (cddr l)) f)))))
Но (sort-f '(4 3 8 2 5) <)
возвращает тот же список. стр. Есть ли способ сделать этот код более элегантным, так как переписывая все car
, cadr
и cdr
?
Я не думаю, что ваш 'СНП-ASC' работает либо. Вероятно, вы должны попробовать что-то вроде [insertion sort] (https://en.wikipedia.org/wiki/Insertion_sort) или [quicksort] (https://en.wikipedia.org/wiki/Quicksort). В любом случае, чтобы использовать функцию, переданную как аргумент, вы можете просто сделать (F ARG1 ARG2) '. Нет необходимости в этом 'LAMBDA'. – jkiiski
@jkiiski Не просто «нет необходимости в этом« лямбда », но он активно заставляет код не работать, поскольку' lambda' возвращает процедуру, которая всегда правдива. –
@ ChrisJester-Young Возможно, jkiiski подумал, что X10D имел в виду '(cond ... (((lambda() (f (car l) (cadr l)))) ...)', который бы сработал. –