You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Implementações concluídas:
**Mermaid.js (4 diagramas):**
- ✅ Figura 3.28: Rede de restrições para conversor Celsius-Fahrenheit (3.3.5)
- ✅ Figura 4.2: Programa fatorial como máquina abstrata (4.1.5)
- ✅ Figura 4.3: Avaliador emulando máquina de fatorial (4.1.5)
- ✅ Diagrama de barreira de abstração: Camadas de sintaxe (4.1.2)
**SVGs baixados do upstream (2 diagramas):**
- ✅ Figura 4.5: Processamento de consultas AND com fluxos de frames
- ✅ Figura 4.6: Processamento de consultas OR com fluxos de frames
**Arquivos modificados:**
- docs/chapter-3/3.3.5.mdx: Adicionado diagrama de rede de restrições
- docs/chapter-4/4.1.2.mdx: Adicionado diagrama de barreira de abstração
- docs/chapter-4/4.1.5.mdx: Adicionados Figuras 4.2 e 4.3 com Mermaid
- docs/chapter-4/4.4.4.mdx: Adicionadas referências às Figuras 4.5 e 4.6
- MISSING_IMAGES.md: Atualizado status (18 concluídos, 7+ faltando)
**Novo diretório:**
- static/img/chapter-4/: Criado com Fig4.5.svg e Fig4.6.svg
**Status geral:**
- Total implementado: 18 diagramas (17 Mermaid + 2 SVG downstream)
- Seções completas: 8 de 11 páginas rastreadas
- Build testado e funcionando corretamente
Relacionado: Fase 2 da implementação de diagramas faltantes
Copy file name to clipboardExpand all lines: MISSING_IMAGES.md
+38-28Lines changed: 38 additions & 28 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -5,8 +5,8 @@
5
5
This report tracks figures/diagrams in the SICP JavaScript translation. Many missing diagrams have been implemented using Mermaid.js for inline rendering.
**Context:**Shows layers separating evaluator from list representation and string representation.
107
+
**Implementation:**Flowchart showing three layers (Evaluator, Tagged List Representation, String Representation) separated by two abstraction barriers (predicates/selectors and parse function).
108
108
109
109
---
110
110
111
-
### 4.1.5 Data as Programs
111
+
### 4.1.5 Data as Programs ✅ COMPLETE
112
112
**File:**`docs/chapter-4/4.1.5.mdx`
113
-
**Missing Images (2):**
114
-
-**Figure 4.2**- `/img/chapter-4/ch4-Z-G-2.svg` - Factorial program as abstract machine
Copy file name to clipboardExpand all lines: docs/chapter-3/3.3.5.mdx
+56-1Lines changed: 56 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -22,7 +22,62 @@ Nossa linguagem fornece um meio de combinar restrições primitivas para express
22
22
9C = 5(F - 32)
23
23
```
24
24
25
-
Tal restrição pode ser pensada como uma rede consistindo de restrições primitivas adder, multiplier e constant (Figura 3.28). Na figura, vemos à esquerda uma caixa multiplicadora com três terminais, rotulados m₁, m₂ e p. Estes conectam o multiplicador ao resto da rede da seguinte forma: O terminal m₁ está ligado a um conector C, que manterá a temperatura Celsius. O terminal m₂ está ligado a um conector w, que também está ligado a uma caixa constante que mantém 9. O terminal p, que a caixa multiplicadora restringe a ser o produto de m₁ e m₂, está ligado ao terminal p de outra caixa multiplicadora, cujo m₂ está conectado a uma constante 5 e cujo m₁ está conectado a um dos termos em uma soma.
25
+
Tal restrição pode ser pensada como uma rede consistindo de restrições primitivas adder, multiplier e constant (Figura 3.28).
26
+
27
+
**Figura 3.28:** Rede de restrições para conversão Celsius-Fahrenheit
Na figura, vemos à esquerda uma caixa multiplicadora com três terminais, rotulados m₁, m₂ e p. Estes conectam o multiplicador ao resto da rede da seguinte forma: O terminal m₁ está ligado a um conector C, que manterá a temperatura Celsius. O terminal m₂ está ligado a um conector w, que também está ligado a uma caixa constante que mantém 9. O terminal p, que a caixa multiplicadora restringe a ser o produto de m₁ e m₂, está ligado ao terminal p de outra caixa multiplicadora, cujo m₂ está conectado a uma constante 5 e cujo m₁ está conectado a um dos termos em uma soma.
26
81
27
82
A computação por tal rede prossegue da seguinte forma: Quando um conector recebe um valor (pelo usuário ou por uma caixa de restrição à qual está ligado), ele acorda todas as suas restrições associadas (exceto pela restrição que acabou de acordá-lo) para informá-las de que tem um valor. Cada caixa de restrição acordada então consulta seus conectores para ver se há informação suficiente para determinar um valor para um conector. Se sim, a caixa define esse conector, que então acorda todas as suas restrições associadas, e assim por diante. Por exemplo, na conversão entre Celsius e Fahrenheit, w, x e y são imediatamente definidos pelas caixas constantes para 9, 5 e 32, respectivamente. Os conectores acordam os multiplicadores e o somador, que determinam que não há informação suficiente para prosseguir. Se o usuário (ou alguma outra parte da rede) define C para um valor (digamos 25), o multiplicador mais à esquerda será acordado, e ele definirá u para 25 × 9 = 225. Então u acorda o segundo multiplicador, que define v para 45, e v acorda o somador, que define F para 77.
Copy file name to clipboardExpand all lines: docs/chapter-4/4.1.2.mdx
+45-5Lines changed: 45 additions & 5 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -20,11 +20,51 @@ As funções de sintaxe usadas pelo avaliador acessam a representação de lista
20
20
21
21
O avaliador lembra o programa de diferenciação simbólica discutido na seção 2.3.2. Ambos os programas operam em dados simbólicos. Em ambos os programas, o resultado de operar em um objeto é determinado operando recursivamente nas partes do objeto e combinando os resultados de uma maneira que depende do tipo do objeto. Em ambos os programas usamos abstração de dados para desacoplar as regras gerais de operação dos detalhes de como os objetos são representados. No programa de diferenciação isso significava que a mesma função de diferenciação poderia lidar com expressões algébricas na forma prefixada, na forma infixada ou em alguma outra forma. Para o avaliador, isso significa que a sintaxe da linguagem sendo avaliada é determinada exclusivamente por `parse` e as funções que classificam e extraem partes das listas rotuladas produzidas por `parse`.
Predicates["Predicados e Seletores de Sintaxe:<br/>is_literal(), literal_value()<br/>is_application(), function_expression()<br/>is_conditional(), conditional_predicate()<br/>..."]
33
+
end
34
+
35
+
subgraph Layer2["REPRESENTAÇÃO DE LISTA ROTULADA"]
**Figura:** Abstração de sintaxe no avaliador. A barreira de abstração 1 (predicados e seletores) separa o avaliador da representação de lista rotulada. A barreira de abstração 2 (`parse`) separa a representação de lista da representação de string.
28
68
29
69
A figura acima representa a barreira de abstração formada pelos predicados e seletores de sintaxe, que interfaceiam o avaliador à representação de lista rotulada de programas, que por sua vez é separada da representação de string por `parse`. Abaixo descrevemos o parsing de componentes do programa e listamos os predicados e seletores de sintaxe correspondentes, bem como construtores se forem necessários.
Copy file name to clipboardExpand all lines: docs/chapter-4/4.1.5.mdx
+59-10Lines changed: 59 additions & 10 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -12,19 +12,68 @@ function factorial(n) {
12
12
13
13
Podemos considerar este programa como a descrição de uma máquina contendo partes que decrementam, multiplicam e testam igualdade, juntamente com um switch de duas posições e outra máquina de fatorial. (A máquina de fatorial é infinita porque contém outra máquina de fatorial dentro dela.) A figura 4.2 é um diagrama de fluxo para a máquina de fatorial, mostrando como as partes são conectadas.
14
14
15
-
<Figure
16
-
src="/img/chapter-4/ch4-Z-G-2.svg"
17
-
alt="O programa fatorial, visto como uma máquina abstrata"
18
-
caption="O programa fatorial, visto como uma máquina abstrata."
**Figura 4.2:** O programa fatorial, visto como uma máquina abstrata. A máquina contém um teste de igualdade (vermelho), operações de decremento e multiplicação (azul), e recursivamente contém outra máquina de fatorial (amarelo tracejado).
20
37
21
38
De maneira similar, podemos considerar o avaliador como uma máquina muito especial que recebe como entrada uma descrição de uma máquina. Dada esta entrada, o avaliador se configura para emular a máquina descrita. Por exemplo, se alimentarmos nosso avaliador com a definição de `factorial`, como mostrado na figura 4.3, o avaliador será capaz de computar fatoriais.
22
39
23
-
<Figure
24
-
src="/img/chapter-4/ch4-Z-G-3.svg"
25
-
alt="O avaliador emulando uma máquina de fatorial"
26
-
caption="O avaliador emulando uma máquina de fatorial."
**Figura 4.3:** O avaliador emulando uma máquina de fatorial. O avaliador atua como uma máquina universal que recebe a definição da função `factorial` como entrada, analisa-a sintaticamente, e através do ciclo evaluate-apply, emula internamente a máquina de fatorial descrita na Figura 4.2.
28
77
29
78
Desta perspectiva, nosso avaliador é visto como uma _máquina universal_. Ele imita outras máquinas quando estas são descritas como programas JavaScript.[^1]
Copy file name to clipboardExpand all lines: docs/chapter-4/4.4.4.mdx
+12Lines changed: 12 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -173,6 +173,12 @@ Para cada frame no fluxo de entrada, usamos `find_assertions` (seção 4.4.4.3)
173
173
174
174
Manipulamos consultas `and` conforme ilustrado na figura 4.5 com a função `conjoin`, que recebe como entradas os conjuntos e o fluxo de frames e retorna o fluxo de frames estendidos. Primeiro, `conjoin` processa o fluxo de frames para encontrar o fluxo de todas as extensões de frames possíveis que satisfazem a primeira consulta na conjunção. Então, usando isso como o novo fluxo de frames, ela aplica recursivamente `conjoin` ao resto das consultas.
175
175
176
+
<Figure
177
+
src="/img/chapter-4/Fig4.5.svg"
178
+
alt="Processamento de consultas AND com fluxos de frames"
179
+
caption="Figura 4.5: Processamento de consultas AND. O fluxo de frames é processado sequencialmente através de cada conjuncto."
180
+
/>
181
+
176
182
```javascript
177
183
functionconjoin(conjuncts, frame_stream) {
178
184
returnis_empty_conjunction(conjuncts)
@@ -193,6 +199,12 @@ configura `evaluate_query` para despachar para `conjoin` quando uma forma `and`
193
199
194
200
Manipulamos consultas `or` de forma similar, como mostrado na figura 4.6. Os fluxos de saída para os vários disjuntos do `or` são computados separadamente e mesclados usando a função `interleave_delayed` da seção 4.4.4.6. (Veja os exercícios 4.71 e 4.72.)
195
201
202
+
<Figure
203
+
src="/img/chapter-4/Fig4.6.svg"
204
+
alt="Processamento de consultas OR com fluxos de frames"
205
+
caption="Figura 4.6: Processamento de consultas OR. Os fluxos de frames dos disjuntos são intercalados para formar o resultado final."
0 commit comments