2012-05-06 1 views
-1

Я думаю, что я где-то читал, что вы можете привязать несколько определений к одному имени в схеме. Я знаю, что неправильно использую эту терминологию. Под этим я подразумеваю, что можно сделать следующее (что было бы очень полезно для определения оператора)?Связывание нескольких определений с одной «переменной» в схеме?

Я считаю, что я читал что-то вроде этого (я знаю, что это не реальный синтаксис)

(let() 
define operator "+" 
define operator "-" 
define operator "*" 
define operator "/")) 

Я хочу проверить еще одну переменную от каждого оператора.

ответ

1

Я не совсем уверен, что вы просите. Вы хотите одну процедуру, которая может обрабатывать различные типы аргументов?

(define (super-add arg1 arg2) 
    (cond ((and (string? arg1) (string? arg2)) 
     (string-append arg1 arg2)) 
     ((and (number? arg1) (number? arg2)) 
     (+ arg1 arg2)) 
     (else 
      (error "UNKNOWN TYPE -- SUPER-ADD")))) 

(super-add "a" "b") => "ab" 
(super-add 2 2) => 4 

Вы заинтересованы в обмене сообщениями?

(define (math-ops msg) ;<---- returns a procedure depending on the msg 
    (cond ((eq? msg 'add) +) 
     ((eq? msg 'sub) -) 
     ((eq? msg 'div) /) 
     ((eq? msg 'multi) *) 
     (else 
      (error "UNKNOWN MSG -- math-ops")))) 

((math-ops 'add) 2 2) => 4 
((math-ops 'sub) 2 2) => 0 

Также правильный синтаксис для let связывания:

(let (([symbol] [value]) 
     ([symbol] [value])) 
    ([body])) 

(let ((a 2) 
     (b (* 3 3))) 
    (+ a b)) 

=> 11 

Это будет очень трудно помочь больше, чем это без вас уточняя, что именно вы пытаетесь сделать.

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

(define (operator? x) 
    (or (string=? "+" x) (string=? "-" x) (string=? "*" x) (string=? "/" x))) 

Если вы принимаете в одну строку, то вам нужно будет разбить его на более мелкие части. У Racket есть встроенная процедура regexp-split, которая сделает это за вас.

(define str-lst (regexp-split #rx" +" [input str])) 
+0

Благодарим вас за ответ! позвольте мне сделать это немного яснее. Ниже перечислены операнды «+» «-» «*» «/» «(« »)« Я хочу знать, можно ли просто привязать их все к имени «операнд» Так что если я собираюсь через список «3 + 4 - 6» он распознает + и - как «операнд». Цель всего этого - создать лексер, который даст мне имена токенов в отношении символа в списке – Ceelos

+0

@Ceelos Каким будет ваш вход? Одна строка? Список строк? Форма схемы? – oobivat

+0

Любая строка будет делать, но фактический проект вызывает чтение из txt-файла, который я превращу в список. Я знаю, как это сделать. (указать файл (file-> list "blah.txt")) – Ceelos

0

Вы можете иметь в виду на values конструкцию, которая «доставляет аргументы в продолжение». Он может использоваться для возврата нескольких значений из функции. Например,

(define (addsub x y) 
    (values (+ x y) (- x y))) 

(call-with-values 
    (lambda() (addsub 33 12)) 
    (lambda (sum difference) 
    (display "33 + 12 = ") (display sum) (newline) 
    (display "33 - 12 = ") (display difference) (newline))) 
+0

Да, я забыл о 'values' /' call-with-values' consruct. Если посмотреть на комментарии Ceelos и другие вопросы, возможно, это не то, что они ищут ... – oobivat

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