0

현재 스킴에서 할당을 위해 작은 프로젝트를 작성 중입니다. 나는 오랫동안 Scheme을 사용하지 않았기 때문에 구문에 강하지 않다.스킴 - if 문에서 "and"를 올바르게 사용하십시오.

문제는 if 문에서 "and"를 사용하는 것입니다. 달력에 약속 목록이 있지만 특정 시간 간격 사이의 약속 만 원합니다. 따라서 시작과 종료 시간을 확인해야합니다.

나는 C#에서 다음과 같이 보일 것이다 달성하고 싶은 것 :

(define (time-calendar cal from-time to-time) 
    (map (lambda (app)(if (> from-time (send 'getstart app)) #t #f)) 
     (send 'getappointments cal))) 

캘린더 "칼"을 소요하고, :

List<appointment> appointments = new List<appointment>(); 

    foreach (appointment app in calendar) { 
     if(app.getstart() >= from-time && app.getend() <= to-time) { 
      appoinments.add(app); 
     } 
    } 

는 내가 현재 계획에있는 것은 이것이다 시간 간격 (시간과 시간) 나는 cal로부터 약속 (app)을 얻고 그들을 반복한다. 각각의 경우, 시작 시간이 "app"의 시작 시간보다 큰지 확인합니다. 그에 따라 true 또는 false를 리턴합니다. 위대한 작품이지만, 약속 시간이 "to-time"전에 끝나면 여전히 고려해야합니다. 이것은 다른 조건을 추가하는 간단한 문제 여야합니다. 그러나 단순히 작동시킬 수는 없습니다.

두 번째 변수를 확인하는 올바른 구문을 알려주는 사람이 있습니까? 약 Racket documentation에 대해 알고 있지만 여전히 문제를 해결할 수 없습니다.

cond에 대해 if 문장을 변경해 보았습니다.

나는이 유사한 "과"부분의 변화의 무리를했지만, 구문 제대로 할 수 없습니다

(define (time-calendar cal from-time to-time) 
    (map (lambda (app)(if (and((> from-time (send 'getstart app))) (< to-time (send 'getend app))) #t #f)) 
     (send 'getappointments cal))) 

답변

5
(and expression1 expression2 ...) 

과도한 괄호가 당신의 표정가있는 경우로 이해됩니다 절차처럼 적용될 수 있습니다. 예.

(and ((if some-var + -) 4 6)) 

결과는 some-var의 값에 따라 -2 또는 10입니다. and(and x)x과 동일하므로 중복됩니다. 코드에 관해서는

, 여기에 어떻게해야입니다 : 그들 중 하나가 잘못된 경우 and#f로 평가하기 때문에

(define (time-calendar cal from-time to-time) 
    (map (lambda (app) 
     (and (> from-time (send 'getstart app)) 
       (< to-time (send 'getend app)))) 
     (send 'getappointments cal))) 

if 중복이었다. ><은 항상 #f 또는 #t 중 하나로 평가됩니다. 그렇지 않은 경우에도 #f을 제외한 모든 데이터를 사용할 수 있으므로 대부분의 경우 if은 중복됩니다. 다른 표현식이 필요하다면 표현식이 무엇을 반환했는지, 전체와 표현식은 술어를 사용하십시오. > 이후 지금 당신이 실제로 and을 필요로하지 않는 많은 인수를 취합니다

나는 내가 "만약"완전히 건너 뛸 수있을 것으로 예상하지 못했을
(define (time-calendar cal from-time to-time) 
    (map (lambda (app) 
     (> from-time (send 'getstart app) to-time)) 
     (send 'getappointments cal))) 
+0

. 정교한 설명 주셔서 감사합니다, 나는 당신의 답변을 완벽하게 이해합니다! – Treelink

+0

내 다음 읽기는 true와 false를 평가해야 할 수도 있습니다. - 약속 시간에 저장되는 시간, 시간 및 시간과 상관없이 모든 항목이 거짓으로 평가됩니다. 글쎄, 적어도 조금 더있어. :) – Treelink

+0

@Treelink 논리를 읽지 못하도록했다.'<'. '(> from-time ('getstart app '을 (를) 보내면)'>'을''(''getstart app 보내기 '')가 시간보다 작고 시간보다 클 필요가 있음을 의미합니다 . 예 :'(> 5 3 1); ==> # t' 이후 '5> 3> 1'이됩니다. 너 알지? – Sylwester