2010-11-18 4 views

ответ

24

В ракетке Вы можете использовать match,

(define t (list 1 2)) 
(match [(list a b) (+ a b)]) 

и связанные с ним вещи, как match-define:

(match-define (list a b) (list 1 2)) 

и match-let

(match-let ([(list a b) t]) (+ a b)) 

Это работает для списков, векторы, структуры и т.д. и т. д. Для нескольких значений вы должны использовать define-values:

(define (t) (values 1 2)) 
(define-values (a b) (t)) 

или let-values. Но обратите внимание, что я не могу определить t как «кортеж», поскольку несколько значений не являются значениями первого класса в (большинстве) реализаций схем.

+0

Это работает, но я искал что-то, что использовало 'let', и это' определяет'. Я предполагаю, что могу написать макрос, который связывает такое определение с «локальным». –

+2

Ну, есть 'match-let' (обновлено с примером), но простой' match' может тоже. (Ваш вопрос заставил его выглядеть так, как вы * хотели * определения.) Кроме того, вы всегда можете использовать определения в локальной области. –

4

Я думаю, что это то, что вы ищете:

Посмотрите на let-values или let+.

+0

Спасибо за сообщение! Единственное, что 'let-values' не делает * совершенно * то, что я хотел, чтобы это делалось, и я не могу получить библиотеку, которая должна использовать' let + 'work. Тем не менее, эта «схема для программистов Python», безусловно, пригодится. –

+0

Ну, по крайней мере, у вас есть классный новый сайт, чтобы вырыть его, если у вас возникнут другие проблемы. Взгляните на него, надеюсь, вы найдете, как настроить среду для 'let +'. Приветствия. –

5

Общий термин для того, что вы ищете (по крайней мере, в Лисп-мире) является и уничтожение того, макрос, который реализует его называют деструктурирующего-затруднительное. В Common Lisp, это работает так:

(destructuring-bind (a b c) '(1 2 3) 
    (list a b c)) ;; (1 2 3) 

он также работает на нескольких «уровней» вложенности:

(destructuring-bind (a (b c) d) '(1 (2 3) 4) 
    (list a b c d)) ;; (1 2 3 4) 

Похоже, что есть nice implementation из деструктурирующего-затруднительное как схема макроса.

5

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

(define t '(1 2)) 
(apply (lambda (a b) 
      ;; code that would go inside let 
     ) 
     t) 

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