Guile이이 사용법에 가장 적합한 체계가 아니라면 어떤 것을보고해야합니까? 나는 기본적으로 awk '{print $N}'
의 Guile equivalent를 찾고있다. 만약 Scheme이 이것을 할 수 없다면, 나는 왜 그런지 알고 싶습니다.Guile 또는 다른 스키마에서 입력 파일 또는 표준 입력에서 n 번째 빈 칸으로 구분 된 필드를 표준 출력으로 출력하는 방법은 무엇입니까?
0
A
답변
0
Guile은 I/O를 2.0에서 2.2로 약간 변경했기 때문에 r6rs I/O를 사용합니다. (잘하면) 두 가지 모두에서 동일하게 작동하지만 2.2로 테스트하지 않았습니다.
이것은 더 이상 최적화 될 수 있습니다.
#!/usr/bin/guile \
-e start -s
!#
(use-modules (rnrs io ports))
;;; Reads one line from current-input-port and prints the field indicated by
;;; field-num. If the line does not have enough fields, it prints a newline.
;;; Returns the field, an empty string, or #f if end of file is reached.
(define (get-field field-num)
(let ((line (get-line (current-input-port))))
(if (eof-object? line)
#f
(let ((fields (string-tokenize line)))
(if (< field-num (length fields))
(let ((field (list-ref fields field-num)))
(put-string (current-output-port)
(string-append field "\n"))
field)
(and (put-string (current-output-port) "\n")
""))))))
;;; Repeat get-field until until end of file is reached
(define (get-all-fields field-num)
(if (get-field field-num)
(get-all-fields field-num)
#f))
(define (start args)
(if (and (> (length args) 1)
(integer? (string->number (list-ref args 1))))
(get-all-fields (1- (string->number (list-ref args 1))))
(display (string-join
`("Usage:" ,(list-ref args 0) "<field-number>\n")
" "))))
+0
이것은 작동하는 것으로 보이며 도움이 될 것입니다. 왜시 뱅 라인에서 줄 계속? 감사. – takatakatek
+0
Guile 매뉴얼에서 권장하는 내용입니다. 외관상으로는 POSIX는 shebang 라인에 관해 침묵을 지키고 있으며, 명령어 뒤에 하나 이상의 것이 있으면 혼합 된 결과를 얻는다. 내가 그것을 정확하게 이해한다면, 하나 이상의 논쟁이있을 때 연속을 사용하는 것이 실제로 더 "휴대 가능하다"는 것이다. –
0
제 블로그에는 an essay에 구분 된 텍스트 파일을 쉽게 처리 할 수있는 기능이 있습니다.
순수 구성표에서는이 작업을 수행 할 수 있지만 표준 라이브러리가 많지 않으므로 불쾌 할 수 있습니다. 그것은 (라틴어 인 경우) (displayln (두번째 (문자열 분할 l)))'). –
@AlexisKing 저는 이것을 답으로 기꺼이 받아 들일 것이지만, 다른 방언의 대안을 보는 것은 좋을 것입니다. 그건 내가 상상했던 것보다 덜 불쾌 해. Brian Kernighan이 제시 한 동일한 C 코드보다 확실히 좋습니다. * for * 매크로는 다른 체계에서 사용할 수 있습니까? * 인라인 *이란 무엇입니까? – takatakatek
아니요, ['for'] (http://docs.racket-lang.org/reference/for.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._for%29 % 29)의 정확한 형태는 [''in-lines'] (http://docs.racket-lang.org/reference/sequences.html#%28def._%28%28lib)와 마찬가지로 라켓 특유의 기능입니다. ._racket % 2Fprivate % 2Fbase..rkt % 29._in-lines % 29 % 29). 후자는 포트의 라인을 반복하는 라켓 "시퀀스"의 생성자입니다. 포트를 지정하지 않으면 기본값은'(current-input-port)', 즉 표준 입력입니다. –