Я почти смущен тем, что задал этот вопрос Racket/Scheme, но кто-нибудь может сказать мне, как избежать повторения вызова функции внутри «там», если он был использован для определения условие «здесь» в первую очередь? (cond [здесь есть])Racket/Scheme: Как избежать повторения вызова функции в cond
То, что я пытаюсь получить, является эквивалентом следующего кода стиля C в Racket/Scheme (обратите внимание, что мне нужно было только один раз вызвать regex(), поскольку он был сохранен в переменной матч):
// initialiation code
if (match = regex("start", "startofstring")) {
list->push(match);
}
else {
printf("No matching regex\n");
}
ракетку код, который я хочу, чтобы избежать заключается в следующем, так как я должен назвать регулярное выражение-матч дважды:
(cond
[(regexp-match #rx"start" "startofstring")
(set! list (cons (regexp-match #rx"start" "startofstring") list)]
[else
(printf "No matching regex\n")])
Теперь, я мог бы сделать:
(define match (regexp-match #rx"start" "startofstring"))
(cond
[match
(set! list (cons match list)]
[else
(printf "No matching regex\n")])
Но этот подход будет означать, что я должен определить очень много переменных, если у меня есть несколько условий (в моем фактическом коде у меня более одного условия ... но ради приведенного выше фрагмента я только ставил в одной). Так что это будет в конечном итоге выглядит некрасиво так:
(define match1 (regexp-match #rx"start" "startofstring"))
(define match2 (regexp-match #rx"blah" "startofstring"))
....
(define matchn (regexp-match #rx"blahn" "startofstring"))
(cond
[match1
(set! list (cons match1 list)]
[match2
(set! list (cons match2 list)]
....
[matchn
(set! list (cons matchn list)]
[else
(printf "No matching regex\n")])
То, что я хотел бы кое-что больше вдоль линий:
(cond
[(define match (regexp-match #rx"start" "startofstring"))
(set! list (cons match list)]
[(define match (regexp-match #rx"blah" "startofstring"))
(set! list (cons match list)]
...
[(define match (regexp-match #rx"blahn" "startofstring"))
(set! list (cons match list)]
[else
(printf "No matching regex\n")])
Но это, очевидно, ошибка синтаксиса, так как (определить .. ..) не может использоваться в условии «здесь». Извините за отсутствие ясности ... Я старался изо всех сил передать то, что я говорю. Я знаю, что это очень просто, но я не могу обернуть вокруг себя (я не использую языки, кроме языков c-style).
«cond => лямбда (совпадение)» на самом деле именно то, что я искал, когда я сказал, что мне нужен эквивалент Racket/Scheme C »(match = regex (« start »,« startofstring »)« Спасибо! – brandonto
Обратите внимание, что правая часть '=>' не должна быть выражением лямбда. Я обновил сообщение, чтобы указать, почему вы, возможно, захотите использовать именованную процедуру, чтобы уменьшить дублирование кода. –