openlang

Gleam 리스트에서 마지막부터 거꾸로 인덱싱할 수 있나요?

- 구분자가 여러 개 들어 있는 문자열을 분리해야 해요. 뒤에서 네 번째 항목이 필요하고, 조각이 그보다 적게 나온 결과는 무시하려고 해요

 let segments = string.split("2-33-444-5555-66666-7777-8888", on: "-")
 let chosen = segments[-4] // <- This syntax is not valid.

이 가이드에는 이렇게 나와 있어요 (https://tour.gleam.run/everything/#basics-lists):

리스트 크기를 구하거나 맨 앞이 아닌 곳에 있는 항목을 가져오려면 비용이 커서 자주 하지 않아요. Gleam에서는 시퀀스에 인덱스로 접근하는 알고리즘을 드물게 쓰고, 그런 경우에는 리스트가 적절한 자료구조가 아니에요.

그런데 다른 자료구조를 제안해 주지는 않아요. 분리한 조각을 뒤에서부터 가져오려면 어떻게 하나요?

영어에서 번역원문 보기

이어지는 대화 2

서로의 근거를 따라
  1. 고유 링크

    먼저 순서를 뒤집으세요:

     let segments = list.reverse(segments)

    그런 다음 4번째 항목을 가져오세요

     let chosen = case list.drop(segments, 3) {
       [fourth, ..] -> fourth
       [] -> ""
     }

    제 컴퓨터에서 실행해 보지는 않았지만, 이렇게 하면 되지 않을까요?

    좀 더 관용적인 방법은 다음과 같아요:

     pub fn fourth_from_tail(entries: String) -> Result(String, Nil) {
       case list.reverse(string.split(entries, on: "-")) {
         // Matches if there are at least 4 segments, binding the 4th from the end to `picked`
         [_, _, _, picked, ..] -> Ok(picked)
         // Discards strings with fewer than 4 segments
         _ -> Error(Nil) 
       }
     }
    영어에서 번역원문 보기
  2. 고유 링크

    [-4]라는 축약 문법을 함수 안으로 감싸는 방법을 찾았어요:

     fn item_from_back(entries: List(a), position: Int) -> Result(a, Nil) {
       let size = list.length(entries)
       case size >= position {
         True -> list.drop(entries, size - position) |> list.first
         False -> Error(Nil)
       }
     }
    
     let segments = string.split("2-33-444-5555-66666-7777-8888", on: "-")
     case item_from_back(segments, 4) {
         Ok(piece) -> io.println("piece: " <> piece)
         _ -> io.println("No piece found!")
    
     }
    영어에서 번역원문 보기

같은 질문의 다른 갈래

  1. Godot 3.3의 GDScript에서 일일이 나열하지 않고 enum 항목을 무작위로 고르기?

    GDScript에서 enum을 이렇게 선언했어요: 가능한 모든 변형을 나열하지 않고 enum 변형을 무작위로 고르고 싶어요. 나중에 변형을 더 추가해도 무작위로 선택하는 코드를 수정하지 않도록요. 이런 방법을 시도해 봤어요:…

    답글 2최근 활동 gdscript
  2. 빈 리덕션은 항등원을 돌려준다

    빈 벡터를 리덕션한다. APL은 답한다. 프리미티브마다 항등원이 있다. 더하기는 0. 곱하기와 논리곱은 1. ⌈/⍬는 인터프리터가 가진 가장 작은 음수다. 호출하는 쪽에 특수 처리가 없다. 리덕션 전에 길이를 확인하지도 않는…

    답글 3최근 활동 apl
  3. 매크로 대부분이 const와 static이 됐다

    Nim은 매크로를 쓰기 쉽게 해 준다. 그게 문제다. macro에 손대기 전에 더 싼 도구부터 본다. const는 매크로를 돌리는 바로 그 VM이 컴파일 시점에 평가한다. 그래서 평범한 proc으로 만든 조회 테이블은 그냥…

    답글 3최근 활동 nim