2016-02-26 2 views
1

Я пытаюсь определить элемент в соответствии с заданными значениями из другого спискаОбъявление локальной переменной в функции из другого списка

(define foo ; not working but this is general idea 
    (λ (x ys) 
     (for/list ([y ys]) 
     (if (eq? x (car y)) 
      (let ('x (cdr y)) 
       (boolean? x)) ; x not passed, returns #f 
      '())))) ; or use x to do something like (eval ('and x #t)) 

Желаемый результат:

>(foo 'a '((a . true) (b . false))) 
#t 

показать булевой (cdr y) на самом деле переходит на x (только пример, который я пытаюсь)

Алгоритм - поиск по ys, для которого (car y) из ea ch в ys, равным a, и установите значение boolean (cdr y) на a. Поэтому приведенный выше x должен иметь значение boolean #t.

Не совсем понятно, почему это не работает.

+1

Машина интерпретированы значение выражения '(let ('x (cdr y)) ...)', вероятно, сильно отличается от того, что вы имели в виду. Это эквивалентно '(let ([quote x] [cdr y]) ...)', где вы говорите, пусть 'quote' =' x' и пусть 'cdr' =' y'. Вероятно, вы имели в виду '(let ([x (cdr y)]) ...)', который говорит let 'x' =' (cdr y) '. Это ты имел в виду? –

ответ

2

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

Похоже, вы пытаетесь вернуть одно значение #t/#f, но если вы посмотрите на для for/list, вы увидите, что он всегда будет возвращать список.

Давайте попробуем что-то вроде этого вместо

(define (foo x ys) 
    (let loop ([ys ys]) 
    (cond [(empty? ys) '()] 
      [(eq? x (caar ys)) (cdar ys)] 
      [else (loop (cdr ys))]))) 

(foo 'a '((a . true) (b . false))) ;=> 'true 
(foo 'b '((a . true) (b . false))) ;=> 'false 

Однако, если вы хотите конвертировать 'true в #t и 'false к #f, вы можете добавить вспомогательную функцию, как так

(define (bool x) 
    (eq? 'true x)) 

(define (foo x ys) 
    (let loop ([ys ys]) 
    (cond [(empty? ys) '()] 
      [(eq? x (caar ys)) (bool (cdar ys))] 
      [else (loop (cdr ys))]))) 

(foo 'a '((a . true) (b . false))) ;=> #t 
(foo 'b '((a . true) (b . false))) ;=> #f 
+0

Спасибо, я только что узнал, что есть 'dict-ref', и это то, что мне нужно. – Chase

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

  • Нет связанных вопросов^_^