2017-10-11 7 views
0

가정하자이 같은 시퀀스를 반환하는 함수 (remove-bad-nodes g) 있어요.당신은 어떻게 REPL에서 철회 할 수 있습니까?</p> <pre><code>[updated-g bad-nodes] </code></pre> <code>updated-g</code> 제거 그 나쁜 노드 그래프이다 <p>하고 <code>bad-nodes</code>이 제거 된 노드를 포함하는 모음입니다 :

(let [[g bads] (remove-bad-nodes g)] 
    ...) 

을하지만 로컬 변수를 정의 :

함수에 또는 let 내부 인수로,이처럼 destructure 수 있습니다. REPL에서 어떻게 할 수 있습니까? 앞으로의 명령에서 업데이트 된 그래프는 g이고 제거 된 노드는 bads으로 참조 할 수 있습니까?

(def [g bads] (remove-bad-nodes g) 

하지만 def는 기호로 첫 번째 인자를 필요로하기 때문에 즉, 작동하지 않습니다 마음에 오는 첫번째 것은 이것이다.

deflet과 같은 구문이없는 이유는 묻지 않습니다. 그것에 대해 이미 a question이 있습니다. REPL에서 "다중 값"을 반환하는 함수를 사용하여 편리하고 실용적인 방법이 무엇인지 궁금합니다. 왜 정상적인 Clojure 연습에서 REPL에서 분해 할 필요가없는 몇 가지 이유가 있다면, 당신이 다른 것을 대신해서 유용한 답을 만들 수 있다고 설명하기 때문입니다. 요즘 내가 이걸 많이 봤어. 그래서 내가 묻는거야. 일반적으로 항상 그런 것은 아니지만,이 함수는 다른 정보와 함께 업데이트 된 버전을 반환합니다. 부작용 코드에서이 함수는 객체를 수정하고 하나의 값 (이 예에서 제거 된 노드) 만 반환하지만 분명히 그렇게하는 것은 Clojurely가 아닙니다.

+1

링크 된 질문에 대한 대답은 다음과 같습니다. "원한다면 당신을 위해 매크로를 작성할 수 있습니다 (예 : def +)." – amalloy

+0

@ amalloy이 질문을 다시 기꺼이 열어 주시겠습니까? [링크 된 질문에 대한 귀하의 답변] (https://stackoverflow.com/a/8198215/1393162)이 나에게 유용한 아이디어를 주었기 때문에 ('def +'매크로 작성), 매우 중요하지 않습니다. 그러나 여기 왜 생각합니까? 이 질문은 별도로 답변해야합니다 : (1) 그것은 정말로 다른 무엇인가에 관한 것입니다 : REPL에서 파괴되는 _how_. (2) 다른 해답은 접미어 적으로 _a_ solution을 언급하며 반드시 유일한 것은 아닙니다. 어쩌면'def +'매크로가 없어도 사용할 수있는 다른 접근법이있을 수 있습니다. 나는 매크로를 총체라고 부르는 좋은 이유가 있다고 생각한다! –

+0

당신은 이미이 질문에 대한 답을 얻었으므로 REPL에 대해 "파괴"라고 부를 수있는 다양한 것들을 보여주었습니다. 사실 REPL에 대한 특별한 것은 아무것도 없었습니다. 'def'는 행동합니다. 이 질문을 다시 열어야 할 이유는 없지만 범위를 개선하기 위해 자유롭게 편집 할 수 있습니다. – amalloy

답변

0

REPL로 w/r/t를 파괴하는 것은 독특합니다. 질문에 대한 답변은 본질적으로 this question과 같습니다.

(let [[light burnt just-right] (classify-toasts (make-lots-of-toast))] 
    (prn light burnt just-right)) 

def 개별 값 :

let을 : 당신의 옵션이 생각

(def result (classify-toasts (make-lots-of-toast))) 
(def light (nth result 0)) 
(def burnt (nth result 1)) 
(def just-right (nth result 2)) 

을 또는 당신을 위해 def 작업을 수행하는 매크로를 작성.

함수가 항상 3 튜플/벡터를 반환하는 경우 다른 표현을 고려해 볼 수도 있습니다. 당신은 다른 방법 classify-toasts에서지도를 반환 할 수 :

{:light 1, :burnt 2, :just-right 3} 

및 다음 당신이 필요로하는 곳 키워드를 사용하여지도를 destructure, 그 값 중 하나를 필요로 할 때 :

(:light the-map) => 1 
0

가 관찰 :

user=> (def results [1 2 3]) 
#'user/results 
user=> (let [[light burnt just-right] results] (def light light) (def burnt burnt) (def just-right just-right)) 
#'user/just-right 
user=> light 
1 
user=> burnt 
2 
user=> just-right 
3 
1

repl에서 이러한 함수로 작업하는 방법은 특별히 흥미로운 경우가 아니면 def 중간 결과가 아니라고 생각합니다. 재미있는 중간 결과를 얻으려면 def을 하나의 이름으로 쓰거나 번거로운 형태로 복수 def을 작성해야하는 번거 로움이 없습니다.

예를 들어

대신

(def [x y] (foo)) 
(def [a b] (bar x y)) 

의 당신은 쓸 수

(let [[x y] (foo), 
     [x' y'] (bar x y)]) 
    (def a x') ; or maybe leave this out if `a` isn't that interesting 
    (def b y')) 

이의 좋은 측면 효과는 REPL에서 주위를 재생하는 동안 작성하는 코드가 훨씬 더 유사 것입니다 언젠가는 소스 파일에 코드를 추가 할 것입니다. 여기서 코드를 반복해서 쓰지 않고 기능을 전달하는 등의 작업을 반복해서 수행 할 것입니다. repl에서 배운 정보를 실제 프로그램에 쉽게 적용 할 수 있습니다.