2013-06-19 4 views
4

В Racket можно вернуть несколько значений из функции, выполнив, например.Игнорирование нескольких возвращаемых значений в Racket

(define (foo) 
    (values 1 2 3)) 

Тогда мы можем связать их, делая

(define-values (one two three) (foo)) 

Теперь one привязан к 1, two на 2 и three к 3.

У меня есть функция, которая возвращает несколько значений, но меня интересуют только некоторые из них. Есть ли способ извлечь «интересные» возвращаемые значения, а «игнорирование» (т. Е. Не связывание) остальное, a la _ в Haskell?

ответ

6

Вы можете использовать match-let-values или match-define-values для этого (в зависимости от того, хотите ли вы переменные лексической или верхнего уровня):

> (match-let-values (((_ _ a _) (values 1 2 3 4))) 
    a) 
; => 3 

> (match-define-values (_ a _ _) (values 1 2 3 4)) 
> a 
; => 2 
+0

Есть ли причина, почему определяют-значения висит вокруг тогда? Кажется, что это правильное подмножество переменных-определителей-совпадений. – jozefg

+2

@jozefg. Ну, 'define-values' - это, в основном, примитив низкого уровня. Если вы запустите какой-либо код через расширитель макросов с опцией show _everything_, вы увидите 'define-values' по всему месту. В конце концов, 'define' - это особый случай' define-values', где есть только одно значение, поэтому 'define' расшифровывается в' define-values'. EDIT: Концептуально полагаю, что 'define-values' может расширяться в' match-define-values', но 'match' является более поздним и более высоким уровнем добавления языка. Думаю, этот вопрос выше моего уровня оплаты. :) –

+1

Как пишет Грег, 'define-values' является примитивным. То есть, это одна из форм, которая может появиться в «полностью расширенном синтаксисе». Поэтому компилятор JIT знает, как скомпилировать 'define-values'. Форма 'match-define-values' на другой расширяется до более простого синтаксиса. Это, конечно, просто деталь реализации - можно скрыть 'define-values', а затем экспортировать' match-define-values' как 'define-values'. В других системах 'define-values' может быть макросом, который расширяется до' call-with-values'. См. Например: http://community.schemewiki.org/?scheme-faq-macros#multidefine – soegaard

Смежные вопросы