2017-12-16 37 views
0

Scheme 언어의 do-loop 내에서 간단한 카운터 증가를 원하지만 언어에 익숙하지 않고 많은 스크립트를 성공하지 못했습니다.Scheme 언어 내 do-loop에서 카운터를 늘리는 방법은 무엇입니까?

(define j 5) 
(Do ((i 10 (+ i 1))) ((>= i 20)) 
(ti-menu-load-string (format #f "/file/read-case \"C:/DataProcessing/Case~a-time~a-sec/test/Case~a-time~a-sec.cas\"" i j i j)) 
(set! j (+ j 1)) 
) 
내가 변경할 수있는 폴더와 파일 이름을 얻을 수 있도록 다음과 같이 DO 루프에 새로운 j 값을 전달하는 방법

: 코드는 여러 사건 파일을 읽을 수 Ansys의 유창함 구현 될 것입니다

Case10-time5-sec 
Case11-time6-sec 
... 

나는 (set! j (+ j 1))이 올바른 일은 아니지만 내가하려는 일에 대한 아이디어를 제공한다는 것을 알고 있습니다. 변수를 변경했을 때 변수를 호출하는 것이 어려워야한다고 생각하지 않습니까? 당신은 단지 사람 같아 용어를 추가 바르와 목록에서

+0

'(set! j (+ j 1))'이 당신이 원하는대로하지 않게 만드는 이유는 무엇입니까? –

답변

2

:

(do ((i 10 (+ i 1)) 
    (j 5 (+ j 1))) 
    ((>= i 20) 'my-return-value) 
    (ti-menu-load-string 
    (format #f "/file/read-case \"C:/DataProcessing/Case~a-time~a-sec/test/Case~a-time~a-sec.cas\"" i j i j))) 
; ==> my-return-value (and as side effect prints some strings) 

do는 재귀 함수 단지 구문 설탕 있음을 ​​알 수 있습니다. 생산 및 인쇄 나누어

(let function-name ((i 10) (j 5)) 
    (if (>= i 20) 
     'my-return-value 
     (begin 
     (ti-menu-load-string 
     (format #f "/file/read-case \"C:/DataProcessing/Case~a-time~a-sec/test/Case~a-time~a-sec.cas\"" i j i j)) 
     (function-name (+ i 1) (+ j 1))))) 

을 실제로 다음의 기능이 제대로 작동 할 수 있습니다 : 당신은 let라는 이름으로 이런 식으로하지 않고이 작업을 수행 할 수

(define (make-strings) 
    (let function-name ((i 10) (j 5) (result '())) 
    (if (>= i 20) 
     (reverse result) 
     (function-name 
     (+ i 1) 
     (+ j 1) 
     (cons (format #f "/file/read-case \"C:/DataProcessing/Case~a-time~a-sec/test/Case~a-time~a-sec.cas\"" i j i j) 
       result))))) 

(for-each ti-menu-load-string (make-strings)) 
이것에 대해

좋은 점이라고 할 수 있습니다 단위 테스트 make-strings, 그것을 확장하여 입력 변수 등을 취하십시오.

+0

감사합니다! 그것은 아주 잘 작동합니다. 내가 추가 한 업데이트를 확인해 주시겠습니까? 조각으로 나눠서 문제가 해결 될 수 있다고 생각했습니다. 나는 그 포스트에서 더 혼란을 일으키지 않았기를 희망한다! – Emma

+0

@ Ema 그들은 관련없는 문제이므로'do' 루프의 변수에 대해이 질문을 확장하는 것은 좋은 생각이 아닙니다. '+ '를 사용하여 숫자를 추가합니다. 예. '(+6 1/10); ==> 6.1'. 나는 [전에이 질문에 답했습니다.] (https://stackoverflow.com/q/47822902/1565698). 하나 이상의 변수에 도움이 필요한 다음 사람을 생각해보십시오. 귀하의 편집 내용이 유용하거나 혼란 스럽습니까? 필요하다면 되돌리고 새로운 쿼리를 만들었을 것입니다. – Sylwester

+0

! 당신이 제안하는 방법'(+ 6 1/10); ==> 6.1은 하나의 케이스 (하나의 외부 do-loop)를 읽는 데 작동하지만 두 번째 루프에서는 실패합니다 : 첫 번째 루프에서 : 'i'는'10','j = 5','datafilenum' '5.100 => 6.000'에서 변경되고 두 번째 루프에서는 'i = 11','j = 6' 및'datafilenum'이'6.100 => 7.000'에서 변경됩니다 어떻게 해야할지 모르겠습니다. 'datafilenum'을 소수점 이하 3 자리수의 변수로 만듭니다. 보시다시피, 필요한 것은 변수'j'를 소수점 뒤에 숫자로 연결하는 것입니다. 희망이 문제를 명확히합니다. – Emma