2017-03-18 9 views
1

Common Lisp는 주어진 결과를 얻기위한 다양한 유연한 코딩 옵션을 제공합니다. 그러나 때로는 최선의 방법을 선택하기가 어렵습니다. 예를 들어, 다음 벡터 식은 모두 다른 방식으로 동일한 결과를 생성합니다.주어진 작업에 적합한 코딩 표현식 선택

(defparameter objects (list 1 2 3)) 

(apply #'vector objects) 

(coerce objects 'vector) 

(make-array (length objects) :initial-contents objects) 

(read-from-string (format nil "#~S" objects)) 

물론 일부 표현식은 필요한 출력에 따라 다른 표현식보다 유연합니다. 위와 같이 주어진 출력에 대해 사용할 기준을 결정하는 데 유용한 기준은 무엇입니까?

+0

일반적으로 * 특정 기준. * ​​다음과 같은 것 : 실제로 수행 할 작업을 수행합니까? 유지 보수 가능합니까? 적절한 성능을 가지고 있습니까? 만족스럽게 확장 할 수 있습니까? 스타일이 이미 적당하다고 가정하면 상점에서 이미 사용하고있는 코딩 스타일과 합리적으로 일치합니까? –

+0

다른 말로하면, ** ** ** ** ** ** ** ** ** ** ** ** 최상의 정의는 무엇이든간에 * 다른 식으로 말하자면, * 이것은 "우리의 특정 기능적 및 비 기능적 요구 사항을 충족합니까?"* 고체). –

답변

4
  • (apply #'vector objects)objects 이상 CALL-ARGUMENTS-LIMIT 요소를 보유하지해야한다는 것입니다 APPLY의 일반적인 제한이 적용됩니다. 당신이 몇 가지 주장 만 가지고있을지라도 이것은 나쁜 스타일입니다.
  • COERCE : 작업을 수행 할뿐만 아니라 의도를 잘 전달합니다. 그러나 결과 벡터에 추가 매개 변수를 제공 할 수 없습니다 (예 : 채우기 포인터 등). 중첩 목록을 행렬로 변환 할 수 없습니다.
  • MAKE-ARRAY은 결과 배열 (조절 기능, 채우기 포인터, 크기, 요소 유형, 위치 변경)에 대한 완전한 제어권을 제공합니다.
  • READ-FROM-STRING은 일반적으로 데이터 변환을 위해 큰 아니요입니다. 쓸모없는 계산의 관점에서이 접근법은 Rube Goldberg의 버전 인 coerce입니다. 문자열에 포함 된 내용을 100 % 확신하지 않는 한 많은 보안 문제가 있습니다. 여기서 문자열을 직접 만들지 만 데이터에 PRINT-OBJECT을 다시 정의한 코드의 다른 부분에 대한 값이 포함되어 있으면 코드가 손상 될 수 있습니다.