는 최근 계획을 공부하고 다음과 같은 방법으로 정의되는 함수 건너 왔습니다 ? null로? 또는 지휘관이이하자 블록하지 않고 함수 정의에서 사용할 수있는 기능을 내장 할 때, CDR하는? 속도 최적화의는의 목적 (CDR, CDR) ((하자)
답변
일반 R5RS Scheme에는 모듈 시스템이 없습니다. 최상위 모듈 만 있습니다. 모든면에서 수정이 가능하므로 원하는 방식으로 언어를 "사용자 정의"할 수 있습니다. 그러나 모듈 시스템이 없으면 이것이 제대로 작동하지 않습니다. 예를 들어, 당신이로드 도서관에서
(define (sub1 x) (- x 1))
쓰기 - 그리고 지금 당신은 -
을 다시 정의 할 수 있습니다 :
(define - +) ; either this
(set! - +) ; or this
을 지금 당신은 실수로 하나의 입력을 감소시키는 sub1
에 의존 내 라이브러리 돌파 , 그리고 결과적으로 창문을 아래로 끌 때 창문이 올라가거나 뭐든간에.
(define sub1 (let ((- -)) (lambda (x) (- x 1))))
이 일이 "더 잘 작동합니다 : 누군가를 변경하기 전에
여러 라이브러리에 의해 사용되는이 주변에있는 유일한 방법은,,, 빼기 기능의 관련 정의를"잡아 "하는 것입니다 "-
을 변경하여 내 sub1
기능의 의미를 수정할 수 없으므로 (제외 ... 당신이 내 라이브러리를 ...로드 전에 당신이 그것을 수정하는 경우)이 결과로,
어쨌든 (그리고 당신이 -
라이브러리가로드 원래 하나라는 것을 알고있는 경우) 일부 컴파일러는이를 감지하여 -
호출이 항상 실제 빼기 함수가 될 것이므로 호출을 인라인으로 수행합니다 (-
에 대한 호출을 인라이닝하면 결과적으로 두 숫자를 빼기위한 어셈블리 코드가 생성 될 수 있음). 큰 속도 향상). 그러나 위의 설명에서 말했듯이, 이것은 실제 이유와 우연히 더 일치합니다.
마지막으로, R6RS (그리고 그 전에 몇 가지 기법 구현)이 고정 및 라이브러리 시스템을 추가, 그래서이 트릭에 대한 사용도 없다했다 다음 sub1
코드가 라이브러리에 다른 코드만큼 안전에 -
을 다시 정의되지는 어떤 식 으로든 컴파일러는이를 기반으로 안전하게 코드를 최적화 할 수 있습니다. 영리한 트릭이 필요 없습니다.
- 1. .cdr to pdf converion
- 2. 스키마 : 목록의 CAR 및 CDR
- 3. 합리적인 형식으로 cdr 파일을 변환하는 PHP 라이브러리
- 4. 별표의 CDR 로그 필드에 대한 설명을 찾고
- 5. "내 다른 차가 cdr"이란 의미는 무엇입니까?
- 6. DrRacket에 set-car에 해당하는 것이 있습니까! 그리고 set-cdr! SICP에서?
- 7. Cisco Call Manager 받기 - .NET에서 데이터 레코드 (CDR) 호출
- 8. Java에서 valuetype 객체를 포함하는 CDR 스트림을 언 마샬링 할 때 endianness를 변경하는 방법
- 9. 하자 이맥스에서 렛트는
- 10. 목적 C와 목적 C++
- 11. 목적
- 12. OptionArg의 목적
- 13. DynaValidatorForm의 목적
- 14. 목적 C는
- 15. 열거의 목적
- 16. ServiceContainer의 목적
- 17. UIControlStateSelected의 목적
- 18. 최종 목적
- 19. 목적 C : 텍스트 필드
- 20. init 함수의 목적
- 21. 종료 맥 목적 C
- 22. PHP 생성자의 목적
- 23. 위치의 목적 : jqgrid의 "last"?
- 24. 삽입 문자열 - 목적 C
- 25. 목적 C : 배열
- 26. Match_parent 특성의 목적
- 27. sqlite 사용 및 목적
- 28. 목적 C는 : 엑스 코드
- 29. 클래스 유형 목적 C
- 30. boost :: checked_delete 목적
철저한 답변을 부탁드립니다! – redwoolf