2011-02-24 3 views

답변

5

partial_sort에 해당하는 기본 제공이 없습니다. 여러분의 선택은 Tcl에서 손으로 구현하는 것인데, 이것은 여러분이 얻고 자하는 효율성을 저해 할 것입니다; 실제로는 partial_sort을 인터프리터에 노출시키는 확장을 작성하십시오. 실제로 그렇게 어렵지는 않을 것입니다. Tcl 확장은 작성하기가 쉽습니다.

#include <algorithm> 
#include "tcl.h" 

using namespace std; 

static int PartialSortCommand(ClientData dummy, 
     Tcl_Interp *interp, 
     int objc, 
     Tcl_Obj *CONST objv[]); 


EXTERN int 
Partialsort_Init(Tcl_Interp *interp) 
{ 
    if (Tcl_InitStubs(interp, "8.0", 0) == NULL) { 
     return TCL_ERROR; 
    } 

    if (Tcl_PkgProvide(interp, "partialsort", "1.0") != TCL_OK) { 
     return TCL_ERROR; 
    } 

    Tcl_CreateObjCommand(interp, "partialsort", PartialSortCommand, 
      (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); 

    return TCL_OK; 
} 

bool CompareObjs(Tcl_Obj *a, Tcl_Obj *b) { 
    int left, right; 
    Tcl_GetIntFromObj(0, a, &left); 
    Tcl_GetIntFromObj(0, b, &right); 
    return left < right; 
} 

int PartialSortCommand(
    ClientData dummy, 
    Tcl_Interp *interp, 
    int objc, 
    Tcl_Obj *CONST objv[]) 
{ 
    if (objc != 5) { 
     Tcl_WrongNumArgs(interp, 1, objv, "list start middle end"); 
     return TCL_ERROR; 
    } 

    Tcl_Obj **objs; 
    int count; 

    if (Tcl_ListObjGetElements(interp, objv[1], &count, &objs) != TCL_OK) { 
     return TCL_ERROR; 
    } 

    int start, middle, end; 
    if (Tcl_GetIntFromObj(interp, objv[2], &start) != TCL_OK) { 
     return TCL_ERROR; 
    } 

    if (Tcl_GetIntFromObj(interp, objv[3], &middle) != TCL_OK) { 
     return TCL_ERROR; 
    } 

    if (Tcl_GetIntFromObj(interp, objv[4], &end) != TCL_OK) { 
     return TCL_ERROR; 
    } 

    partial_sort(&objs[start], &objs[middle], &objs[end], CompareObjs); 
    Tcl_SetObjResult(interp, Tcl_NewListObj(count, objs)); 
    return TCL_OK; 
} 

이 그냥 러프 컷 물론 : 여기 시작 난 그냥 가야하는 채찍질 코드의 비트입니다. 정수 목록 만 처리합니다. 그것은 오류 검사의 방식으로 많은 일을하지 않습니다. 공유 된 Tcl_Obj 구조와 관련해서는 좀 더 무심하다. 그러나 바라건대 그것은 당신이 올바른 디렉토리에 갈 수있게 해줄 것입니다.

+0

+1 : Tcl은 실제로 'partial_sort'와 같이 아무 것도 없습니다. 'Tcl_ListObjGetElements'의 값 배열로부터 새로운'Tcl_Obj'를 만들기 위해 그것을 변경하고 * 그 * 객체의 값 배열에 대해 작업한다면, 그것도 (단지) 정결하게 될 것입니다. –

관련 문제