저장 위치를 찾고 일정을 이름 붙이고 필요한 만큼만 요구하세요.
정본 프로그램 스물한 개로 지역 상태, 대입의 장단점, 환경 규칙, 가변 연결, 회로 시간, 동시성 제어, 지연 계산, 수치 스트림, 함수형 이력과 객체 이력을 다시 연결합니다.
어느 저장 위치가 바뀌는지, 어느 프레임이 이름을 공급하는지, 어느 일정이 관찰을 만드는지, 어느 지연 계산이 강제됐는지, 어떤 인터페이스가 그 세부를 숨기는지 설명할 수 있나요?
- 상태 클로저의 여러 호출에 걸친 대입 따라가기
- 별도 클로저가 만든 비공개 저장 위치 구분하기
- 대입이 계측과 실험 진행을 숨기는 장점 설명하기
- 대입이 이력과 순서 의존성을 만드는 비용 설명하기
- 명시적인 환경 조회·프로시저 생성·정의·대입 규칙 적용하기
- 프로시저 적용마다 매개변수 프레임 하나 기록하기
- 처음 force와 메모이즈된 force 구분하기
- 무한 스트림에서 유한한 앞부분만 요구하기
- 큐의 front·rear와 링크 변경 따라가기
- 파괴적 append와 별칭과 순환과 고유 pair 정체성 추적하기
- 같은 시드에서 같은 상태 전이 재현하기
- 연결된 제약을 통해 빠진 값 전파하기
- 명시적인 시뮬레이션 시간으로 사건 정렬하기
- 전선과 게이트와 지연과 의제를 회로로 합성하기
- 오래된 읽기에서 생기는 갱신 손실 찾기
- 공유 잠금 하나로 상태 변경 두 개 직렬화하기
- 상호 배제와 순환 대기 회피 구분하기
- 비공개 호출 환경에서 서로 재귀적인 도우미 해석하기
- 기존 테이블 레코드 갱신하고 새 중첩 레코드 연결하기
- 연속한 수치 근삿값을 지연 스트림으로 표현하기
- 숨은 객체 상태와 명시적인 재사용 가능 스트림 이력 비교하기
지역 상태와 monitored 프로시저와 유한 실험은 대입의 모듈성 장점을 보여 줍니다. 호출자는 안정된 프로토콜을 사용하고 장부 상태는 비공개로 남습니다. 되풀이한 withdraw와 명시적인 호출 일정은 같은 소스 식도 이전 이력과 순서에 따라 달라지는 비용을 보여 줍니다.
환경 평가기와 프레임 transcript는 어휘 조회와 동적 적용을 나눕니다. lambda는 생성 환경을 포획하고 적용은 새 매개변수 프레임을 연결합니다. 정의는 첫 프레임을 바꾸며 대입은 이미 있는 바인딩을 찾아 바꿉니다.
큐와 가변 테이블과 파괴적 append와 순환은 전체 값을 다시 만들지 않고 선택한 연결을 바꿉니다. 정체성이 관찰 가능해지므로 안전한 순회에는 이미 본 pair 객체의 명시적인 집합이 필요할 수 있습니다.
시드 생성기와 제약 네트워크와 의제와 디지털 회로는 숨은 문맥을 상태·알려진 값·시뮬레이션 시간으로 드러냅니다. 회로는 중앙 진리표가 아니라 전선 action과 지연된 게이트 갱신에서 나타납니다.
엇갈린 실행과 serializer는 오래된 읽기와 보호된 일정 하나를 비교합니다. 두 잠금 수업은 상호 배제만으로 순환 대기를 막지 못하며 공유 id 순서가 모델링한 순환을 없애는 별도 경계임을 보여 줍니다.
promise와 스트림은 현재 값과 지연된 미래 작업을 나눕니다. 수치 스트림은 모든 부분합과 Newton 추측값을 남깁니다. 상태 생성기와 함수형 스트림의 비교는 같은 유한 값을 만들면서도 정체성·재생·이력이 다르게 남는 과정을 보여 줍니다.
- 출력
- —
- 값
- —
- 진단
- —
기존 수업 열두 개는 각 첫 예상 관찰을 유지합니다. 대입의 장점은 (9 16 2 reset 0), 대입의 비용은 (90 80 90 90)을 반환합니다. 환경 평가기는 (7 13), 적용 프레임은 값 25와 프레임 세 개를 반환합니다. 파괴적 append는 ((a b c d) (c d) #t), inverter는 (2 1 4 0), 잠금 순서 이체는 ((90 50) (45 95) 95 45 #f #f)를 반환합니다. 수치 스트림은 정확한 부분합과 Newton 추측값을 반환하며 객체와 스트림은 같은 다섯 수 앞부분을 만듭니다.
지속되는 바인딩, 대입 전이, 명시적 일정 순서, 프레임 확장과 조회, 처음과 메모이즈된 force, 요구한 스트림 꼬리, 큐와 테이블 링크, 공유 pair 정체성, 시드 갱신, 커넥터 알림, 정렬된 의제 삽입, 게이트 action, 오래된 읽기, 잠금 획득과 해제, 지역 도우미, 정확한 부분합 상태, 객체와 스트림의 점화 단계를 찾으세요. 실행 흐름은 선택한 실행을 고정 런타임 한도 아래에서 정확히 기록합니다.
상태와 시간과 정체성과 지연 계산을 생각하는 질문 스물한 개
답이 이전 호출에 의존하기 시작하면 무엇이 달라질까요?
정답 단일 바인딩을 가진 중첩된 let 식 세 개가 실행 순서를 명시적으로 만듭니다. 따라서 각 결과는 100에서 다시 시작하는 대신 앞선 호출이 남긴 상태를 반영합니다.
같은 프로시저가 만든 두 카운터가 서로의 값을 덮어쓰지 않는 이유는 무엇일까요?
정답 두 번째 예제는 value를 두 프로시저 바깥으로 옮깁니다. 그러면 그 단일 위치가 공유되므로 어느 한 프로시저를 통한 갱신이 다른 프로시저의 시작점이 됩니다.
force를 두 번 호출해도 계산이 한 번만 일어나는 이유는 무엇일까요?
정답 두 번째 force는 본문을 다시 실행하지 않고 저장된 값을 반환합니다. 최종 calls 값은 1로 유지되어 결과에서 메모이제이션을 직접 확인할 수 있습니다.
끝이 없는 수열을 유한한 실행에서 어떻게 사용할 수 있을까요?
정답 stream-ref는 요청된 인덱스에 도달하는 데 필요한 만큼만 정확히 꼬리를 force합니다. 인덱스 9를 요청하면 유한한 접두사를 구성하고 10을 반환하므로 이 특정 실행은 종료됩니다.
삽입을 지역적인 변경으로 만들려면 앞 포인터뿐 아니라 뒤 포인터도 필요한 이유는 무엇일까요?
정답 삭제는 연결을 다시 쓰지 않습니다. front를 현재 cdr로 전진시킬 뿐입니다. a, b, c를 삽입하고 한 번 삭제하면 front는 b가 든 쌍을 가리키고 rear는 여전히 c가 든 쌍을 가리킵니다.
상태가 매번 바뀌는 생성기가 어떻게 정확히 같은 수열을 반복할 수 있을까요?
정답 점화식은 결정론적입니다. 따로 구성된 두 생성기는 각자의 비공개 위치에서 시작하지만, 시작 시드가 같으면 값 수열도 같아집니다. 이 수업의 생성기는 상태와 재현 가능성을 직접 관찰할 수 있게 만듭니다.
세 값 가운데 어떤 두 값이 먼저 와도 하나의 관계가 올바르게 반응하려면 무엇이 필요할까요?
정답 forget-value!는 철회자가 저장된 제공자일 때만 성공합니다. 사용자가 total을 잊으면 adder는 자신이 유도하여 제공한 값인 right를 철회하지만, 독립적으로 제공된 left 값은 철회할 수 없습니다. 그 후 새로운 right 값을 제공하면 같은 관계를 통해 새로운 total이 유도됩니다.
시뮬레이션은 등록된 순서를 따르지 않고 다음 사건을 어떻게 고를까요?
정답 propagate는 가장 이른 사건을 꺼내 그 수치 변화를 signal에 적용하고, 결과 상태를 해당 사건 시간 옆에 기록합니다. agenda는 논리적 시뮬레이션 시간을 모델링하며, 이 예제들은 명시적인 삽입 규칙에 따라 각 사건을 순서대로 처리합니다.
두 갱신이 어느 쪽도 끝나기 전에 같은 잔액을 읽으면 무엇이 사라질까요?
정답 두 번째 스케줄은 출금이 읽기 전에 입금이 읽기와 쓰기를 마치도록 합니다. 따라서 출금은 110을 보고 90을 씁니다. 이 프로그램들은 선택된 두 가지 유한 스케줄과 그에 따른 정확한 최종 잔액을 나열합니다.
한 갱신이 상태를 읽은 뒤 다른 갱신이 끝나고 나서야 쓰는 일을 막으려면 무엇을 보호해야 할까요?
정답 make-serializer는 공유 잠금을 받아 프로시저 래퍼를 반환합니다. 래퍼는 상태 변경 프로시저를 호출하기 전에 획득하고, 결과를 받은 뒤 해제합니다. 제공된 유한 스케줄에서는 출금이 balance를 읽기 전에 직렬화된 입금이 완료되므로, 최종값 90에 두 갱신이 모두 유지됩니다. 이 수업은 이 정확한 스케줄과 최종 상태를 기록합니다.
여러 지역 프로시저가 바깥 환경에 이름을 흘리지 않으면서 서로를 참조하려면 어떻게 해야 할까요?
정답 두 번째 프로그램은 정의를 인용된 데이터로 다루고 동시적인 지역 범위를 설명하는 scan-out 모양을 만듭니다. 먼저 모든 이름을 명시적인 unassigned 표시로 바인딩하고, set!으로 각 프로시저 값을 설치한 뒤, 남은 본문을 평가하는 형태입니다. 이번 실행은 변환 데이터와 unassigned 및 set! 구조를 화면에 직접 드러냅니다.
테이블에서 한 레코드를 갱신하거나 새로운 중첩 키 경로를 만들 때 어떤 연결을 바꿔야 할까요?
정답 두 키 테이블은 첫 번째 키 레코드의 cdr에 또 다른 연관 리스트를 저장합니다. 새로운 두 번째 키는 그 하위 테이블을 바꾸고, 새로운 첫 번째 키는 완전한 하위 테이블을 바깥 테이블에 연결합니다. arithmetic 값을 10에서 11로 바꾸는 일은 중복 레코드를 만들지 않고 가장 안쪽 기존 레코드를 갱신합니다. 이 예제는 #f를 조회 실패로 사용하므로 #f 자체를 저장하려면 더 풍부한 조회 규약이 필요합니다.
숨은 상태는 언제 서로 독립적인 프로시저의 협력을 더 단순하게 만들까요?
정답 두 번째 프로그램은 Monte Carlo 제어기와 상태가 있는 실험 객체를 분리합니다. monte-carlo는 experiment를 호출하면 다음 boolean이 나온다는 사실만 알고 남은 결과의 표현은 모릅니다. 제공된 유한 리스트는 실행을 재현 가능하게 만들고 대입의 모듈성 장점을 직접 모델링합니다.
식이 상태를 바꿀 수 있다면 어떤 치환과 순서 변경 논리가 더 이상 성립하지 않을까요?
정답 순서 probe는 let 바인딩으로 일정 의존성을 소스에 직접 적습니다. zero 메시지를 먼저 부르면 one 메시지가 읽기 전에 상태가 바뀝니다. one을 먼저 부르면 예전 상태를 봅니다. 여기의 결론은 평가기가 피연산자를 어느 순서로 고르는지에 기대지 않습니다.
식이 프로시저를 만들 때와 그 프로시저를 나중에 적용할 때 각각 어느 환경을 사용할까요?
정답 두 번째 프로그램은 프레임 변경을 직접 드러냅니다. 조회는 전역 x보다 지역 x를 먼저 찾습니다. set-variable-value!는 이미 있는 지역 레코드를 바꾸고 define-variable!은 첫 프레임에 y를 더합니다. 어느 연산도 전역 x를 바꾸지 않습니다. 이 설명용 평가기는 나열한 형식의 환경 규칙을 직접 모델링합니다.
중첩되고 되풀이되는 프로시저 적용에서 같은 매개변수 이름은 어떻게 서로 다른 바인딩으로 남을까요?
정답 make-adder는 x = 5인 프레임을 기록하고 그 환경에 계속 접근하는 클로저를 반환합니다. add-five를 나중에 호출하면 포획한 환경에 연결된 y = 7 프레임이 생깁니다. transcript는 이 연결을 드러내기 위해 교육용 프레임 이름을 사용합니다.
변경과 정체성은 append와 순회 같은 익숙한 리스트 연산의 의미를 어떻게 바꿀까요?
정답 순환 예제는 마지막 cdr을 첫 pair로 되돌립니다. 보통 재귀 리스트 순회는 빈 리스트에 닿지 못합니다. count-unique-pairs는 내려가기 전에 모든 pair 정체성을 기록하고 memq가 이미 본 pair를 찾으면 0을 더합니다. 프로그램은 프린터가 순환을 끝없이 펼치게 하지 않고 eq?로 순환을 보고합니다.
지역 게이트 규칙은 어떻게 명시적인 시뮬레이션 시간을 따라 펼쳐지는 회로 동작으로 합쳐질까요?
정답 half-adder는 or, and, inverter, 또 다른 and 게이트로 구성됩니다. 유한 일정은 먼저 0 입력을 안정화하고 a, b, a를 차례로 바꿉니다. 기록한 시간은 이 모형에 지정한 지연에서 나온 정확한 시뮬레이션 이벤트입니다.
각 자원을 개별적으로 직렬화해도 왜 교착될 수 있으며 어떤 순서 규칙이 그 순환을 없앨까요?
정답 이체 프로그램은 계정 잠금 두 개를 잡기 전에 숫자 id로 순서를 정합니다. 호출자가 반대 방향의 이체를 요청해도 두 연산은 같은 잠금 순서를 사용합니다. 유한한 순차 시연은 두 이체를 끝내고 두 셀을 해제하며 선택한 잠금 프로토콜의 전체 상태 변화를 기록합니다.
수치 반복이 마지막 답만 숨겨 돌려주는 대신 모든 중간 근삿값을 설명하면 무엇이 달라질까요?
정답 sqrt-stream은 √2를 향한 모든 Newton 개선을 드러냅니다. 정확한 유리수 수열은 1, 3/2, 17/12, 577/408, 665857/470832로 시작합니다. 생산자를 바꾸지 않고 더 많은 추측값을 살펴볼 수 있습니다. 표시한 앞부분은 선택한 시작값의 개선 수열을 정확히 기록합니다.
상태를 객체 안에 숨기는 대신 스트림으로 표현하면 어떤 의존 관계가 더 잘 드러날까요?
정답 reset 가능한 객체는 비공개 seed를 제자리에서 바꿉니다. 함수형 버전은 seed 1에서 새 스트림을 만들어 다시 시작하며 이전 스트림도 계속 남습니다. 같은 결과 리스트는 유한 앞부분의 일치를 확정합니다. 객체는 정체성과 명령을, 스트림은 재사용 가능한 이력과 명시적 데이터 흐름을 강조합니다.