저는 라켓에 익숙하지 않고 프로젝트를위한 유한 상태 시스템을 만들려고합니다. 여기 내가 지금까지 가지고있는 것이있다. 라켓 함수가 실제 목록 대신 빈 목록을 전달합니다.
#lang racket
(define (test rules cs pass lst)
(if (eq? (length lst) 0)
(if (member cs pass)
(write 'passed)
(write 'failed))
(test rules (next rules cs (car lst)) (cdr lst))))
(define (next rules cs input)
(if (eq? cs (car (car rules)))
(if (eq? input (car(cdr(car rules))))
(car(cdr(cdr(car rules))))
((next (cdr rules) cs input)))
(next (cdr rules) cs input)))
는 내가 입력
(define rules '('(0 a 0) '(0 b 1) '(1 a 0) '(1 b 1)))
(define pass '(1))
(test rules 0 pass '(a b a b))
내가 알아낼 수없는 이유
, 나는 규칙은 내가 아니에요 확신 빈 목록이 인 것처럼 this error on the next function. 그것은 역할을 얻는다. 어쨌든 누군가가 왜 그렇게하고 있는지 말해 주면 정말 도움이 될 것입니다.감사합니다.
EDIT1
도움 주셔서 정말 감사드립니다. 정말 도움이됩니다. 이 코드는 끝날 때까지 완전히 작동하지만 이제 testmany로 여러 목록을 테스트하면 코드 끝에 오류가 발생합니다.
(define (testmany rules cs pass lst)(if (eq? (length lst) 0)
(write 'done)
((test rules cs pass (car lst))
(testmany rules cs pass (cdr lst)))))
(define (test rules cs pass lst) (if (eq? (length lst) 0)
(if (member cs pass)
(write 'accepted.....)
(write 'rejected.....))
(test rules (next rules cs (car lst)) pass (cdr lst))))
(define (next rules cs input) (if (eq? cs (car (car rules)))
(if (eq? input (car(cdr(car rules))))
(car(cdr(cdr(car rules))))
(next (cdr rules) cs input))
(next (cdr rules) cs input)))
코드는 testmany 함수의 재귀를 언제 멈추는 지 알 것 같지 않습니다. 목록이 비어 있으면 done을 인쇄하지만 목록에 여전히 요소가있는 것처럼 다음 부분을 계속 수행하여 this error.을 던집니다. 왜이 오류가 발생하는지 알면 알려주세요. 감사합니다. 그것없이
(define (testmany rules cs pass lst) (if (eq? (length lst) 0)
(write 'done)
(begin
; ^^^^^ here
(test rules cs pass (car lst))
(testmany rules cs pass (cdr lst)))))
, (test rules cs pass (car lst))
의 반환 값이 함수로 사용할 수 있도록 시도;
'(define rules ...)'에 대해서는 [quote and list의 차이점은 무엇입니까?] (https://stackoverflow.com/questions/34984552/what-is-the-difference-between)를 참조하십시오. -quote-and-list)와 그것의 답. 의심 스러울 때'list' 만 사용하면 더 간단합니다. –
'((next ...)'는'next' 함수가 즉시 호출하는 함수를 반환한다는 것을 의미합니다. 반환 값이 다른 것이라면'apply'에서 런타임 오류가 발생합니다. ''('(0 a 0) ...)'((quote (0 a 0)) ...)'는 외부 따옴표 만 코드이므로 나머지는 데이터가됩니다 – Sylwester
이 시나리오에서는'(member cs pass) '를 호출하면 충돌이 발생할 것입니다.이 문제를 해결하려면'(boolean? (member cs pass')와 if 문을 'failed'로 전환하여이 예제와 일관되게 유지해야합니다. '(test ...)'함수의 마지막 줄에는 너무 적은 수의 인수가 있습니다.테스트는 4 회, 3 회만 통과했습니다. –