Today
-
Yesterday
-
Total
-
  • 러스트와 다른 언어의 멀티라인 처리 비교
    Programmer/Programming 2019. 2. 12. 14:38

    새줄문자가 들어간 스트링 리터럴 출력

    Rust

    fn main() {
        println!("In the rooom the women come and go,
            Singing of Mount Abora");
    }

    결과 : 스트링 리터럴의 새줄문자와 공백문자를 그대로 출력

    In the rooom the women come and go,
            Singing of Mount Abora

    C

    #include <stdio.h>
    
    int main()
    {
        printf("In the rooom the women come and go,
            Singing of Mount Abora");
        putchar('\n');
    }

    결과 : 빌드 실패

    cc -Wall -O2 -o prt_nl_str prt_nl_str.c
    prt_nl_str.c:5:12: warning: missing terminating '"' character
          [-Winvalid-pp-token]
        printf("In the rooom the women come and go,
               ^
    prt_nl_str.c:5:12: error: expected expression
    prt_nl_str.c:6:31: warning: missing terminating '"' character
          [-Winvalid-pp-token]
            Singing of Mount Abora");
                                  ^
    prt_nl_str.c:12:11: error: expected '}'
    /* End: */
              ^
    prt_nl_str.c:4:1: note: to match this '{'
    {
    ^
    2 warnings and 2 errors generated.

    Python[각주:1]
    파이썬에서 멀티라인은 연속된 작은따옴표 3개(''') 또는 큰따옴표 3개(""")를 사용한다.

    print("""In the rooom the women come and go,
            Singing of Mount Abora""")

    결과 : Rust와 같은 결과

    In the rooom the women come and go,
            Singing of Mount Abora

    Common Lisp

    (princ "In the rooom the women come and go,
            Singing of Mount Abora")

    결과 : 스트링 리터럴의 새줄문자와 공백문자를 그대로 출력.[각주:2]
    러스트와 동일

    In the rooom the women come and go,
            Singing of Mount Abora


    긴 문자열을 여러줄로 나누어서 표현하기

    Rust
    역슬래쉬(\)로 쉽게 표현 가능.

    fn main() {
        println!("It was a bright, cold day in April, and \
            there were four of us-\
            more or less.");
    }

    결과 : 역슬래쉬 다음의 모든 화이트스페이스(whitespace)는 제거된다.
    들여쓰기를 할 수 있어서 읽기 좋은 코드를 작성할 수 있다.

    It was a bright, cold day in April, and there were four of us-more or less.

    C
    각각을 작은 문자열로 나누어 적는다. 역슬래쉬는 공백 없이 적어야 해서 들여쓰기가 깨진다.

    #include <stdio.h>
    
    int main()
    {
        // (1)
        printf("It was a bright, cold day in April, and "
            "there were four of us-"
            "more or less.");
        putchar('\n');
        // (2)
        printf("It was a bright, cold day in April, and \
            there were four of us-\
            more or less.");
        putchar('\n');
        // (3)
        printf("It was a bright, cold day in April, and \
    there were four of us-\
    more or less.");
        putchar('\n');
    }

    결과 :

    It was a bright, cold day in April, and there were four of us-more or less.
    It was a bright, cold day in April, and         there were four of us-        more or less.
    It was a bright, cold day in April, and there were four of us-more or less.

    (2)의 결과를 보면, 역슬래쉬 다음 줄의 공백이 그대로 포함된다.
    즉, 들여쓰기 만큼 공백을 출력되어 원하는 결과가 나오지 않았다.
    Rust처럼 출력되는 (3)을 보면 들여쓰기는 엉망이다.
    가독성이 떨어진다.
    C에서는 (1)과 같은 방식으로 작성하는 것이 가장 좋다.

    Python
    각각을 작은 문자열로 나누어 연결한다. 역슬래쉬는 공백 없이 적어야 해서 들여쓰기가 깨진다.

    # (1)
    print("It was a bright, cold day in April, and " + \
          "there were four of us-" + \
          "more or less.")
    # (2)
    print("""It was a bright, cold day in April, and \
            there were four of us-\
            more or less.""")
    # (3)
    print("""It was a bright, cold day in April, and \
    there were four of us-\
    more or less.""")

    결과 :

    It was a bright, cold day in April, and there were four of us-more or less.
    It was a bright, cold day in April, and         there were four of us-        more or less.
    It was a bright, cold day in April, and there were four of us-more or less.

    C와 비슷하다.
    가독성과 목적을 달성한 것은 문자열을 '+' 연산자로 연결하여 출력하는 (1)의 방법이다..

    Common Lisp
    각각을 작은 문자열로 나누어 연결한다.

    (princ (concatenate 'string
                        "It was a bright, cold day in April, and "
                        "there were four of us-"
                        "more or less."))
    (fresh-line)
    (princ "It was a bright, cold day in April, and \
            there were four of us-\
            more or less.")

    결과 : 역슬래쉬로는 긴 문자열을 표현할 수 없다.

    It was a bright, cold day in April, and there were four of us-more or less.
    It was a bright, cold day in April, and
            there were four of us-
            more or less.


    결론

    언어

    여러줄 문자열

    한 줄 문자열을 여러줄의 문자열로 표현하기

    Rust

    모양 그대로 출력

    역슬래쉬로 편하게 구현 가능. 들여쓰기까지 가능

    C

    빌드 실패

    개별 문자열을 나열해야 함. 역슬래쉬를 사용하면 들여쓰기 불가능. 

    Python

    모양 그대로 출력

    개별 문자열을 이어붙어야 함. 역슬래쉬를 사용하면 들여쓰기 불가능.

    Common Lisp

    모양 그대로 출력

    개별 문자열을 이어붙어야 함. 역슬래쉬를 사용할 수 없음.

    러스트가 여러줄(multi-line) 문자열을 다루는데 매우 편리함을 볼 수 있다.
    이 밖에서 탈출문자(escape sequence)를 사용할 필요가 없는 저수준 문자열(raw string)과
    유니코드가 아닌 8 바이트 슬라이스(slice)로 다루는 바이트 문자열도 제공한다.



    1. Rust와 C와 같은 조건을 위해서 8개의 공백을 띄움 [본문으로]
    2. sbcl과 clisp 사용 [본문으로]

    댓글

Designed by Tistory.