2017-01-31 2 views
0

방금 ​​LFE로 시작 했으므로이 책을 읽는 동안 (SICP, LFE 버전) 책에서 몇 가지 예제를 시험해 보았습니다. 운동 1.4에서 나는 식 #'+/2#'-/2을 봅니다.Lisp에서 +와 - 연산자의 결합 성 얼랭 (Flavored Erlang)

그래서 REPL (funcall #'+/2 1 2)을 입력하고 (예상대로) 3을 얻습니다. 마찬가지로 (funcall #'+/1 1)1이됩니다. 그러나 (funcall #'+/3 1 2 3)은 오류를 발생시킵니다. 왜 이런거야? 나는 물론 (funcall #'+/2 1 (funcall #' +/2 2 3))을 할 수는 있지만 실제로는 #'+/3이 잘못된 것처럼 보이는 이유를 이해하고 싶습니다.

마지막으로, 내 자신의 기능을 구현하는 경우 약간이 방법으로 임의의 수의 인수를 허용하는 기능을 구현하는 방법 (funcall #'FUNC/arity ....). 이 질문이 별도의 질문으로 여겨지면 느낄 수없는 용어로 나를 도와주십시오.

답변

1

나는 또한 LFE를 시작하지만, 수집 한 것에서는 it doesn't support variadic functions입니다. 이것은 수학 연산자가 2 개의 인수 만 허용한다고 생각합니다. 사실 작동한다는 사실 : (+ 1 2 3 4 5)은 매크로가 실행되고 있다고 생각하게 만듭니다.

분명히 LFE 매크로 에는 this thread에 따라 여러 개의 인수가 있습니다. 아직 매크로를 깊이 들여다 보지는 않았지만.

조언 : 가변 인수가 필요하다고 생각되면 변수 인수 대신 함수에 목록을 전달해보십시오. 여전히 이라면은 가변적 인 기능이 필요하다고 생각하면 매크로로 만드십시오.

정말 좋은 조언이 아니라면 매크로 작성을 피하십시오. 그들은 내가 사용 해본 모든 언어로 분석하고, 디버그하고, 소비하기가 더 어렵습니다. 다른 언어보다 LISP에서 더 뛰어나지 만 조언은 여전히 ​​유효하다고 생각합니다.

+0

예, 나는 또한 같은 결론에 도달하기 시작했습니다. 나는 두 개의 인수만을 취하는 프리미티브 추가 함수가 있다는 인상을 받았고 + 함수는 인수 목록을 받아들이고 반복적으로 처리하도록 구현되었습니다. 아마, 그 재귀의 기본 경우 (단일 요소가있는 목록)는 단일 요소 자체를 반환하기 위해 작성되므로 # '+/1이 작동합니다. 또는, 다른 요소가있는 두 개의 함수가 있습니다. 하나는 단일 요소를 가져 와서 반환하고 다른 하나는 두 개를 취합니다 (그리고 이전 요소를 재귀 적으로 호출합니다). 나는 Erlang에 대해서도 많이 알지 못한다. – Jordan