LINUX.ORG.RU

Несколько вопросов про Racket


1

2

Пишу кое-что на Racket, возникло несколько вопросов. Первые 2 вопроса элементарные, но принципиальные. Я знаю множество способов для 1) и 2), но интересует самый верный и стандартный.
1. Как добавить элемент в конец списка? Да, не в начало, а в конец.
2. Как удалить i-ый элемент из списка?
3. Хочу, чтобы область видимости структуры распространялась только на 2 функции внутри модуля. Как это сделать?
4.

> (filter (lambda (x crap) (> x 2)) '(1 2 3 4 5))
filter: expected argument of type <procedure (arity 1)>; given #<procedure>
Стоит ли использовать типизацию таким образом в своем коде?
Пока все, вроде..
Спасибо.

> 1. Как добавить элемент в конец списка? Да, не в начало, а в конец.
(append (list 1 2) (list 3))

urxvt ★★★★★
()

3. Хочу, чтобы область видимости структуры распространялась только на 2 функции внутри модуля. Как это сделать?

 
(define (getFnG)
  (let ((x 0))
    (define (f nx) (set! x nx))
    (define (g) x)
    (cons f g)))

(define FnG (getFnG))

(define f (car FnG))
(define g (cdr FnG))

kyz
()
Ответ на: комментарий от kyz

Я использую структуры, специфичные для Racket:

(struct point (x y))
По поводу твоего кода: конструктор и селектор определены в глобальной области видимости, а мне так не нужно.

kermzyxer
() автор топика
Ответ на: комментарий от kermzyxer

>Я использую структуры, специфичные для Racket:

и что это меняет?

По поводу твоего кода: конструктор и селектор определены в глобальной области видимости, а мне так не нужно.

что мешает сделать его локально?

kyz
()

1. списки иммутабельные, по-этому только append

2. append+take/drop или for/list

3. если (struct ...) находится нвутри let-формы, то его область видимости ограничивается этой let-формой, то есть как-то так

(define-values (g h)
  (let ()
    (struct point (x))
    (define (g x) (point x))
    (define (h p) (point-x p))
    (values g h)))

anonymous
()
Ответ на: комментарий от anonymous

3. Еще можно использовать пакеты (racket/package)

4. Всмысле - стоит ли использовать контракты? Стоит.

anonymous
()
Ответ на: комментарий от korvin_

Придется делать отдельный файл. Если это не единичный случай - будет неудобно, лучше пекеджи использовать.

anonymous
()

1. Как добавить элемент в конец списка? Да, не в начало, а в конец.

Можно использовать mutable пары, хранить последнюю пару и делать set-mcdr! для добавления элемента.

(define lst (mcons 1 '()))
(define a1 (mcons 2 '()))
(set-mcdr! lst a1)
lst
--> {0 1}

(define a2 (mcons 3 '()))
(set-mcdr! a1 a2)
lst
--> {0 1 2}
tentaclius
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.