DayDreamin’ Comics https://ddcomics.org/ Have you ever seen a dream walking? Well i did. Sat, 03 May 2025 12:49:56 +0000 en-US hourly 1 https://wordpress.org/?v=6.8.1 https://i0.wp.com/ddcomics.org/wp-content/uploads/2023/07/cropped-DD-icon.jpg?fit=32%2C32&ssl=1 DayDreamin’ Comics https://ddcomics.org/ 32 32 230705254 Write up on Jacqueline Harpman’s Who Have Never Known Men https://ddcomics.org/2025/05/03/write-up-on-jacqueline-harpmans-who-have-never-known-men/ https://ddcomics.org/2025/05/03/write-up-on-jacqueline-harpmans-who-have-never-known-men/#respond Sat, 03 May 2025 12:49:41 +0000 https://ddcomics.org/?p=5024 Background of Study Introduction Jacqueline Harpman was born in Etterbeek, Belgium, in 1929. Her family fled to Casablanca when the Nazis invaded, and only returned home after the war. After studying French literature she started training to be a doctor, but could not complete her training due to contracting tuberculosis. She turned to writing in […]

The post Write up on Jacqueline Harpman’s Who Have Never Known Men appeared first on DayDreamin’ Comics.

]]>
Background of Study

Introduction

Jacqueline Harpman was born in Etterbeek, Belgium, in 1929. Her family fled to Casablanca when the Nazis invaded, and only returned home after the war. After studying French literature she started training to be a doctor, but could not complete her training due to contracting tuberculosis. She turned to writing in 1954 and her first work was published in 1958. In 1980 she qualified as a psychoanalyst. Harpman wrote over 15 novels and won numerous literary prizes, including the Prix Médicis for Orlanda. I Who Have Never Known Men was her first novel to be translated into English, and was originally published with the title The Mistress of Silence. Harpman died in 2012.

Literature Review

The novel follows a young nameless narrator through her dystopian life. She has always lived in a windowless cage with 39 other women, none of whom remember how they came to live in the cage or how much time has passed since they first arrived. Their amnesia is likely drug-induced and sustained by their lack of desire to talk about their individual histories. In this cage they are given sleeping pads, minimal food, one toilet and zero privacy. They are constantly patrolled by male guards who never speak and rarely look at them yet are always watching. If the women try to touch one another, a whip cracks, threatening violence. If the women attempt to kill themselves, a whip cracks again, telling them that there is no escape from this life. In short, the women are merely surviving.

As our narrator gets older, even though her age is unknown, she begins to understand more and more of this existence that they all live in. Given that she has never known a life outside of the cage, her perspective is nuanced and inquisitive. She questions the system in which she lives, a trait that opposes the other womens’ mindless acceptance of that which they cannot change.

In the pivotal moment of the novel, an alarm sounds and all of the guards immediately leave the cage which had just been unlocked to give the women food. The women are at first apprehensive to leave out of fear that the guards will come back, yet eventually the narrator sprints up the stairs until she is outside, something she has never experienced. As they look at the barren landscape where the bunker resides under, they begin to realize that they are not on Earth but a different planet entirely. There is no trace of the guards or where they went, leaving the women truly alone.

Throughout the rest of the novel, the women walk across the planes and find other bunkers, some with men and some with women, all of whom are dead as their cages were locked when the alarm sounded. The women begin to realize that they are truly alone and begin to create a society for themselves with home-like structures and romantic relationships. The narrator finds great joy in building and learning, yet quickly gets tired of the stagnant existence that they occupy once again.

By the end of the novel, the narrator is alone in the most literal sense. All of the women from her bunker died before her due to her being the youngest. In her grappling with this, the reader feels all the same questions as the narrator due to the unexplained circumstances of their existence. Despite a persistent sense of hope that she will find other people, be rescued or have some resolution, she ultimately dies never knowing why her life has been what it was. While this can be viewed as a tragedy, there is something deeply human about the truth remaining just out of reach.

Ultimately, this is a novel about love, existence and what it means to be human. The narrator believes she has never known love, yet as her relationships with certain characters develop, readers can begin to understand that she does feel love in a different way. She has never interacted with a man and thus only knows the love and care of a woman and of the community which they built as a means of survival in a world that forgot them. 

Jacqueline Harpman’s novel I Who Have Never Known Men is a work of speculative fiction. Set in an unidentified dystopian universe, the narrative world remains mysterious to the first person narrator and protagonist throughout. Therefore, because the unnamed narrator is unable to explain the reasons for her circumstances, she cannot relay them to the reader. The narrator is also writing from a retrospective angle. For this reason, she employs both the past and present tenses. The following summary adheres to a more linear mode of explanation and relies upon the present tense.

When the narrator is a child, she is ripped from her home and family and imprisoned in a cage underground with 39 other women. Because she is so young, the other women guess she was grouped with them by mistake. In the cage, the women have no understanding of why they are being held captive. They are constantly watched by a set of perpetually rotating guards. Although they are fed, allowed to wash and converse, and given mattresses to sleep on, they have no other comforts or freedoms.

When the narrator is roughly 15 or 16 years old, she begins to realize that the other women know things that she does not. Indeed, they are often talking and laughing amongst themselves. However, whenever she approaches, they stop their chatter. When she asks questions, they dismiss her and refuse to relay their stories to her.

In an effort to have a secret of her own, the narrator begins inventing stories for herself. These private fantasies grant her sexual pleasure. However, because she knows nothing about men, about sex, or even about her own body, she does not know how to name what she is feeling.

One day, the narrator befriends Anthea. Over the course of the weeks that follow, the two foster a kinship. Anthea is kind to the narrator and humors her questions and ideas.

Not long later, an alarm goes off at the very moment one of the guards is unlocking the cage to feed the women. At the sound of the alarm, the guards flee. Once they are gone, the narrator retrieves the key and frees the women.

Although the other women are convinced that the guards will return, the narrator is unafraid. She is thrilled to have escaped the cage and bunker. Indeed, the women have been delivered into the world above.

Over the course of the following weeks, the women begin to wander the desolate, indistinguishable landscape where they find themselves. When they start discovering other bunkers like the one where they were held, they hope they will find an unlocked cage. However, each bunker holds the same horror: a locked cage filled with the mummified bodies of both women and men.

The women eventually decide to settle down. They create a small village for themselves by a river. Although most of the women are happy, the narrator is restless. She wants to explore and discover.

After all the last of her companions die, the narrator finds herself completely alone. Initially this solitude feels liberating. Over time, however, she grows increasingly despairing. She particularly misses Anthea, realizing that what they shared was love. The narrator repeatedly delivers herself from despair by reinvigorating her search for meaning and understanding. However, no matter where she goes and how long she searches, she finds no explanation to what happened to her.

When she falls ill, the narrator decides that she will pen her account. Having found a bunker designed for comfort and enjoyment rather than torture, she settles in for her final days. She writes her story in the hopes that someone someday will find it and remember her.

The post Write up on Jacqueline Harpman’s Who Have Never Known Men appeared first on DayDreamin’ Comics.

]]>
https://ddcomics.org/2025/05/03/write-up-on-jacqueline-harpmans-who-have-never-known-men/feed/ 0 5024
Write up on Dr Who: Season 1 Episode 3 The Forest of Fear https://ddcomics.org/2025/05/03/write-up-on-dr-who-first-series-episode-3-the-forest-of-fear/ https://ddcomics.org/2025/05/03/write-up-on-dr-who-first-series-episode-3-the-forest-of-fear/#respond Sat, 03 May 2025 09:23:29 +0000 https://ddcomics.org/?p=5020 Literature Review: Dr. Who Season 1 :Episode 3 The most quoted bit of The Forest of Fear comes in the first couple of minutes: ‘Fear makes companions of all of us.’ It’s a charming moment, beautifully played by Hartnell and Hill. But it’s atypical of the episode, which elsewhere pits the Doctor’s self-centeredness against Barbara’s compassion. This […]

The post Write up on Dr Who: Season 1 Episode 3 The Forest of Fear appeared first on DayDreamin’ Comics.

]]>
Literature Review:

Dr. Who

Season 1 :Episode 3

The most quoted bit of The Forest of Fear comes in the first couple of minutes: ‘Fear makes companions of all of us.’ It’s a charming moment, beautifully played by Hartnell and Hill. But it’s atypical of the episode, which elsewhere pits the Doctor’s self-centeredness against Barbara’s compassion. This is most represented in the moment when the Doctor picks up a rock, clearly to finish off the injured Za and make good his and Susan’s escape (Ian’s visible disgust at this point is one of the best William Russell moments). It’s the third time in the episode that a lot of focus is placed on a hand clutching a sharp rock. In the opening sequence, Old Mother steals Za’s knife, and Waris Hussein dwells on it, in close up, for several seconds. Later, there’s a focus on Kal’s knife as he finishes off Old Mother. These are all the moments of most apparent peril.

But the episode hinges less on these than on two moments of compassion. The first is Old Mother’s. Creeping into the Cave of Skulls, she frees the time travelers on the proviso that they do not make fire. Then, later Barbara impulsively sacrifices her freedom to help Za and Hur. Though the Season One production team would never have explicitly allowed it, Barbara may well be inventing humanity here, introducing concepts like friendship and cooperation to the Tribe of Gum, who, it’s implied, are among the few surviving human beings at this time.

The one where the Doctor is caught planning to murder an injured man…

At the top of this episode the Doctor apologizes for getting them all into this mess, claiming it’s all his fault. But when you think about it, it’s not his fault at all. All he did was go exploring and he was violently abducted and imprisoned. This isn’t like his recklessness in the next serial, when they visit Skaro and he purposefully sabotages the TARDIS so that they’re forced to explore the alien city. This time he is purely a victim of circumstance and has had little active part to play in getting them into trouble.

Eileen Way, who plays Old Mother, was only 52 when she recorded this serial, but make-up supervisor Elizabeth Blattner does a great job of ageing her up and making her look much older than she is. As she grabs Za’s stone and stares impassively into camera we’re treated to another example of how director Waris Hussein likes to focus closely on faces to sell the story and dialogue.

And what cracking dialogue this is. Received fan wisdom about these latter three episodes of 100,000 BC claims that they’re dull and boring, but that’s far from true. Writer Anthony Coburn has given his actors – even the prehistoric ones – some beautiful lines in this story. They’re not ugly, grunty lines as one might expect. There’s consideration for character in the dialogue for the cave dwellers, and the regulars – especially William Hartnell – get some timeless lines.

For instance, this beauty: “Fear makes companions of all of us, Miss Wright… Fear is with all of us and always will be. Just like that other sensation that lives with it… hope!” It’s so good that this line was reused (in slightly mangled form) 51 years later in Listen.

We’re soon treated to Susan’s second hysterical scream when a pile of twigs moves in the corner of the cave and Old Mother bundles through. Old Mother is a bit of a stick-in-the-mud. She doesn’t approve of fire, and doesn’t think any tribe leader should discover its secret. She prefers to stay cold and eat raw meat, it seems. But maybe there’s more to it than that. Her scenes with Za in The Cave of Skulls hint that she may be Za’s mother, as he sneers that she should have died with his father. If that is the case, then the secret of fire is what brought about her partner’s demise, so maybe she has a grudge against it because of that? There’s more to Coburn’s script than people expect.

Meanwhile, in the fearful forest, it’s Barbara’s time to go into meltdown. And boy, Jacqueline Hill gives it some welly! She collapses into Ian’s arms as she realises they are lost and cannot find their way back to the TARDIS. To be honest, she has had a taxing time. Yesterday, she got up in her flat (which may or may not be “littered with stray cats and dogs”, according to Ian!), did a full day’s teaching, then after work went spying on one of her pupils, got whisked away to another place and time, falling unconscious on the way, then got attacked and captured by a bunch of savage cavemen, before escaping and getting lost in a prehistoric wasteland with an old man who really doesn’t seem to give a fig for her. Let’s be honest, she deserves to lose it a bit!

“We’re never going to get out of this awful place, never, never!” she yelps. More tears, more histrionics, but Ian acts as her rock and soothes and calms her. “Ian, what’s happening to us?” she weeps. Ian holds her face close to his to try and talk sense into her, but it’s very nearly an amorous embrace too.

The Doctor and Ian argue over who is leader of their little tribe. The Doctor won’t follow Ian’s orders blindly, but he admitted earlier that Ian was the strongest and might need to defend them. I don’t blame Ian for getting frustrated with the old goat, and he makes it clear that if it wasn’t for Susan and Barbara, he’d leave the Doctor to make his own way to the Ship. This is not a cohesive group.

“Aren’t you a tiresome young man?” growls the Doctor. “And you’re a stubborn old man!” retorts Ian. Now, now, boys, focus on the job at hand please…

After another almighty scream from Babs when she spies a dead animal, we get another example of Waris Hussein’s wonderful directorial flourish when the wild animal attacks Za. It happens off camera, but the way Hussein shoots it is graphic enough – the camera, acting as the creature’s point of view, surges on Za, and we hear growls and snarls as we see Hur’s horrified face watch the attack. Then we see the terrified faces of the TARDIS travellers and hear Hur’s traumatised moans and screams. We then see Za laced with blood, with huge claw marks across his chest. It’s a pretty graphic scene despite us not seeing a single hair of a creature.

Ian, Barbara and Susan help the injured Za while the Doctor stands well back, observing with disdain. This is not a Doctor we recognise today. He is heartless and selfish, referring to the cavemen as savages without logic or reason. But if he’d seen Hur and Za scheming earlier, or could see how Kal is whipping up tension back at the caves, he’d think differently. Barbara says: “You treat everybody and everything as less important than yourself.” She’s right. In this single episode, the Doctor is perhaps at his most inhuman, malevolent and unfeeling.

Much is made of the moment the Doctor picks up a rock with a view to finishing off Za for good so that they can get on their way back to the Ship, and the look on William Russell’s face when he catches the Doctor out is wonderful. Ian Chesterton is definitely appalled by the Doctor’s actions, but it’s clear William Russell is too!

The episode ends with Kal winning support from the tribe to go after Za, Hur and the strangers, and there’s more proof that these so-called savages are more emotionally advanced than the Doctor thinks. It is suggested that Kal murders Old Mother so he can point the finger of blame at Za, and so Old Mother becomes Doctor Who’s first ever death.

As the episode ends, a glowering Kal blocks the way back to the TARDIS for our heroes. Impressive chest bared, Jeremy Young certainly gives great glower! Next Episode: The Firemaker, we’re told, and we’re left to wonder who that’ll be. Za or Kal? Or another…?

The post Write up on Dr Who: Season 1 Episode 3 The Forest of Fear appeared first on DayDreamin’ Comics.

]]>
https://ddcomics.org/2025/05/03/write-up-on-dr-who-first-series-episode-3-the-forest-of-fear/feed/ 0 5020
Write up on Miguel de Unamuno’S Mechanopolis https://ddcomics.org/2025/05/03/write-up-on-miguel-de-unamunos-mechanopolis/ https://ddcomics.org/2025/05/03/write-up-on-miguel-de-unamunos-mechanopolis/#respond Sat, 03 May 2025 09:19:12 +0000 https://ddcomics.org/?p=5016 Introduction Background of the Study Poet, novelist, and playwright Miguel de Unamuno was born on September 29, 1864, in the Basque city of Bilbao. Unamuno’s father, Felix, died when the poet was six, and his mother, Salomé Jugo, gave her children a devout Catholic upbringing. Unamuno at one time wished to become a priest, but […]

The post Write up on Miguel de Unamuno’S Mechanopolis appeared first on DayDreamin’ Comics.

]]>
Introduction

Background of the Study

Poet, novelist, and playwright Miguel de Unamuno was born on September 29, 1864, in the Basque city of Bilbao. Unamuno’s father, Felix, died when the poet was six, and his mother, Salomé Jugo, gave her children a devout Catholic upbringing. Unamuno at one time wished to become a priest, but his love for a childhood sweetheart, Concepción Lizárraga, kept him from the priesthood. They would marry in 1891. Unamuno attended the University of Madrid, where he studied languages and philosophy and received a PhD in 1884. He returned to Bilbao after school and, in 1891, became a professor of Greek at the University of Salamanca. In 1900, Unamuno became the rector at the university. Throughout his life, he would publish essays on metaphysics, politics, religion, and travel. He also published more than ten novels and numerous plays.

Unamuno did not begin to publish poetry until the age of forty-three. His first book, Poesías (1907), used common Spanish to offer the poet’s impressions of nature and travel. Unamuno had translated the poets Samuel Taylor Coleridge and Giacomo Leopardi, and their influence on his early work is clear. In 1907, Unamuno published Rosario de sonetos lícos [Rosary of Sonnets, 1911], which was followed in 1920 by El Cristo de Velasquez [The Christ of Velasquez, 1951]. Begun in 1913, The Christ of Velasquez ran 2,538 lines and reflects the poet’s desire to define a uniquely Spanish Christ. Many people consider it to be Unamuno’s greatest poem.

During the summer of 1920, while El Cristo was in press, Unamuno prepared a volume of travel sketches, Andanza y visions [Spanish Travels and Visions, 1922]. Many of the prose poems in this volume were published in daily newspapers, and the book contains some of Unamuno’s most anthologized work. This book was followed by Rimas de dentro [Rhymes from Within, 1923], and another book of prose and verse, Rimas de un poeta desconocido presentadas y presentado por Miguel de Unamuno [Teresa: Rhymes of an Unknown Poet Presented by Miguel de Unamuno, 1924].

Before copies of Teresa reached Unamuno, political events forced a change in his life. On September 13, 1924, General Miguel Primo de Rivera launched a successful military coup in Spain. Unamuno published a number of articles critical of the new government. He was exiled without his family in 1924 to the island of Fuerteventura in the Canaries. His exile brought him international attention and acclaim. He left Fuerteventura for Paris on a private boat and, in 1924, he published De Fuerteventura a París: Diario íntimo de confinamiento y destierro vertido en sonetos [From Fuerteventurato Paris: Intimate Diary of Confinement and Exile Poured out in Sonnets]. While in Paris he completed Romancero del destierro [The Ballads of Exile, 1928], which would be the last book of poetry published in his lifetime.

In 1930, King Alfonso of Spain removed the dictator, Primo de Rivera, and in February, Unamuno triumphantly returned home and regained his position as rector at the University of Salamanca. When General Francisco Franco took power in 1936, many of Unamuno’s friends and colleagues were executed. At the university convocation, the poet angrily denounced Franco’s rebellion. General Franco gave permission to shoot Unamuno, but, to avoid an international incident, the poet was confined to strict house arrest, where he died on New Year’s Eve, 1936.

Significance of the Study

“Mechanopolis” begins with an unnamed narrator lost in a desert, nearly dead, who happens upon an oasis where he finds an automated railway system that takes him into a deserted city where machines maintain an automated society long after humanity has left. The forgotten cafeterias allow our narrator to eat. That was true in the Campbell story too. However, in this story the narrator goes mad as he realizes the machines have souls, and even write about his activities in their daily newspaper, spooking the hell out of him. The abandoned cities in “Twilight” still functioning by self-repairing machines, but they inspire a great sense of wonder, not fear.

In the end of “Mechanopolis,” the narrator escapes the city and returns to the desert. He encounters Bedouins who save him. When the narrator returns home he works to stay as far away from machinery as possible

The post Write up on Miguel de Unamuno’S Mechanopolis appeared first on DayDreamin’ Comics.

]]>
https://ddcomics.org/2025/05/03/write-up-on-miguel-de-unamunos-mechanopolis/feed/ 0 5016
Write up on Tsitsi Dangarembga’s Nervous Conditions https://ddcomics.org/2025/05/03/write-up-on-tsitsi-dangarembgas-nervous-conditions/ https://ddcomics.org/2025/05/03/write-up-on-tsitsi-dangarembgas-nervous-conditions/#respond Sat, 03 May 2025 09:14:55 +0000 https://ddcomics.org/?p=5013  Introduction Background of Study “Nervous Conditions,” by Tsitsi Dangarembga, and first published in 1988, is the fictional story of the formative years of Tambudzai (generally referred to as “Tambu”), a native African girl growing up in a rural part of Rhodesia (now Zimbabwe) in the 1960’s and 1970’s. Written in first-person perspective, as an adult […]

The post Write up on Tsitsi Dangarembga’s Nervous Conditions appeared first on DayDreamin’ Comics.

]]>
 Introduction

Background of Study

“Nervous Conditions,” by Tsitsi Dangarembga, and first published in 1988, is the fictional story of the formative years of Tambudzai (generally referred to as “Tambu”), a native African girl growing up in a rural part of Rhodesia (now Zimbabwe) in the 1960’s and 1970’s. Written in first-person perspective, as an adult reflecting upon her upbringing, the story focuses on the inner turmoil that Tambu struggles with during her childhood, as she recognizes disparities and unfairness due to racism and sexism, among other things.  

Tsitsi Dangarembga is a writer and filmmaker whose work centers the African experience, with a focus on Zimbabwe. Her 2020 Booker Prize–shortlisted novel This Mournable Body (Faber & Faber, 2020) completes her Tambudzai Trilogy, which traces the life of a rural girl from her childhood in colonial Zimbabwe to her adulthood in a country repressed by political elites. Dangarembga lives and works in Zimbabwe, where she is the founding director of the Institute of Creative Arts for Progress in Africa (ICAPA) Trust.

Interrogating the ongoing repression and oppression in her home country—which includes torture, abduction, rampant corruption, and vote manipulation in a nation of largely immiserated, acquiescent citizens—Dangarembga’s research explores answers to the question, “What kind of people behave like that?” This question applies not only to power elites but also to enablers of systematic national oppression and to those who allow themselves to be oppressed. Her work is premised on the assumption that when a given population generates people who wield power destructively on an ongoing basis, the source of this tendency lies within the construct of that population.

Literature Review

The story opens with, “I was not sorry when my brother died.”   

The protagonist, Tambu, as she is known, experiences a life of abject poverty. As a child, she toils in the fields, performing difficult tasks at a very young age, as this is simply the way of life for the Shona people. Hard work is not to be questioned. As she develops into a young adult, however, she yearns for more than a life of poverty, difficulty, and subservience. She resents the patriarchal construct of the culture, which seems to be designed to prevent a female from pursuing the opportunities afforded males. She fears and resents the influence of white culture, as well, yet is drawn to it with a conflicting desire to receive education, even at the risk of unintended assimilation.   

While Tambu’s father is well known for his laziness and resultant financial failure, her uncle, Babamukuru, is quite the opposite. He finds the motivation and the means to leave Africa for a time in order to study in England. While doing so, his family— wife, daughter, and son— accompanies him. We learn later on in the book that to Tambu’s great surprise, her aunt Naiguru also earns a degree at the university.  

After five years abroad, Babamukuru and his family triumphantly return to Africa, now proudly able to claim university degrees, and prepared to reap the benefits. From the moment of the glorious return, Babamukuru achieves God-like status within his family, as he is the only male member of the family to have earned a degree. Babamukuru is promoted to headmaster of a Christian mission, where he is granted the benefits of a generous salary, a house with indoor plumbing, and not just one, but two automobiles. Once established, he agrees to host and sponsor Tambu’s older brother, Nhamo, as a student at the mission. As the only surviving male produced by Tambu’s parents, he is the natural choice to receive the education.  

Over the course of the next few months, Tambu notices troubling behavior from her brother, Nhamo, as his assimilation to the culture at the mission naturally results in the disintegration of his own roots. Nhamo rejects the native tongue in favor of using more English. He gloats frequently about how much more worthy of a person he is becoming, and how he no longer deserves this life of squalor afforded by the home he grew up in. All of this breeds deep resentment in Tambu, who wishes for the opportunity to become educated, but is resigned to the knowledge that the odds of this dream ever coming true are infinitesimally small.   

Tambu presents her educational goals to her parents. Her father scoffs at the idea, and scolds her for expecting him to pay for this folly. Tambu has come prepared for the argument, and replies that she will pay for own education, which her father mocks as silly. However, Tambu’s mother understands that Tambu is not easily dissuaded, so she suggests that Tambu be given the opportunity to try. She tells her husband that Tambu’s predicted failure will be the most effective way to teach Tambu that this dream of hers is impossible. This reasoning is enough for Tambu’s father to agree that if she pays the tuition, she may attend school.  

Tambu ambitiously works, growing extra crops on an unused plot on the family’s property, in the hope of selling the produce to tourists. Her plan is to eventually save up enough money to pay for formal education. She encounters some difficulties, including Nhamo’s theft of some of her crops, but eventually has enough to sell. In a stroke of good fortune, on her first attempt to sell at a tourist area, a wealthy white woman is outraged at the sight of a child working, and, believing she is witnessing the tragedy of child slavery, simply hands over a sum of money great enough to cover Tambu’s school expenses for many years to come.  

One day, Babamukuru arrives, bearing the terrible news that Nhamo had suddenly fallen ill while at the mission, and has died.  

After the mourning period has passed, Tambu realizes that her position is now assured as the child chosen to receive an education. Not only has she found the means to finance her education, but now, as the eldest sibling to two sisters, she is no longer outranked by a male sibling. She fully embraces the opportunity to pursue a better life through education.  

Tambu enrolls at the mission where her Babamukuru is the headmaster, and she lives in his home. Babamukuru’s daughter, Nyasha, is Tambu’s age, and while they’ve known each other for many years, only become close now, as they share a bedroom. A deep friendship develops, although there are still misgivings, doubts, and some lack of trust on Tambu’s part, as she feels that her cousin has sacrificed too much of her own culture and traditions in favor of, “Englishness.” 

Both girls are dedicated students, but Nyasha soon begins to exhibit the signs of teenage rebellion. Her interest in boys has increased, and she resents her father’s rules. While she remains dedicated to her studies, she is distracted by dancing, dress, and other English influences. This distraction is disturbing for Tambu to see, and she remains wary of her cousin, and becomes even more aware of the possibility of English influence upon herself.  

On a long Christmas break, the entire family returns to the village. Tambu does not want to go, as she has grown fond of the comforts of living at the mission. However, being ordered to do so, she returns to her parents’ home, only to find it even more wretched than she had remembered. She is disgusted by the filth and the disrepair of the house, and is not impressed with her father’s continued laziness.  

During this family reunion, unrest and bickering overshadow the stay. Relatives have personal complaints about others, and animosity flows freely. However, the resolution of conflict appears to be decided by the patriarchy, as males are to be obeyed. The men will sometimes accept information or even advice from female members of the family, but all final decisions and judgements are those of the men. Observing this sexist system only strengthens Tambu’s resolve to become educated and successful, in order to empower herself, and thus empower other women in her family and community.  

Tambu returns to the mission boarding school, and feels less and less motivation to return to her home. At the same time, she struggles with her desire to maintain her heritage, without losing it to the ways of the whites. She is disturbed by the behavior of Nyasha, as her cousin becomes more and more rebellious. Nyasha wears seemingly inappropriate clothes, speaks disrespectfully to her father, and smokes cigarettes. Towards the later chapters, she even develops an eating disorder in an effort to remain thin, a shallow value instilled in her by the white culture she has grown to embrace.

A few months after returning to school, she is accepted into a more sophisticated, more Westernized school, run by the Catholic Church. Her apprehension over the dangers of assimilation is eclipsed by her personal desire to succeed, and to overcome the constraints that a male, and white, dominated society have placed upon her. She knows that she must gain the education, in order to overcome, yet she remains ever wary of the dangers that threaten to rob her of her culture. Thus, her nervous condition is maintained, as she tries to walk the fine line between preserving her heritage, and boldly seeking freedoms.  

Significance of the Study

Chapter 6-7


Summary

Although Tambu had once thought of white people as repulsive (an opinion she hated to have), she learns to admire the white people who live and work at the mission, and makes friends with one girl in particular, Nyaradzo. Nyaradzo has two older brothers, Brian and Andy, who attend secondary school in Salisbury. When Chido is old enough, Babamukuru sends him to the school in Salisbury as well, which has a mostly white student body. Meanwhile, Nyasha is studying for her Form Two examinations, even though it is likely that she will pass because she is the headmaster’s daughter. Determined to succeed, she works so hard that she is loses weight rapidly (this is also due to Nyasha’s eating disorder, but Tambu does not understand that yet). Nyasha passes at the top of her class, thanks to all her hard work.

During the holidays, Chido comes back from boarding school in Salisbury, and he, Tambu, and Nyasha attend a student Christmas party. Babamukuru is furious with the way Nyasha is dressed to go to the event, but Maiguru defends her daughter’s attire. Tambu is anxious about going to the Christmas dance, as she rarely attends social events, but once she finds her friends and starts to dance, she relaxes and has fun. Andy, one of Nyaradzo’s older brothers, walks home with Chido, Tambu, and Nyasha, and stays to flirt with Nyasha at the end of the driveway. Chido and Tambu try to sneak indoors without being seen but are caught by Babamukuru, who has waited up for them. He goes to the end of the driveway to fetch Nyasha and sees her talking to Andy.

Babamukuru and Nyasha have a terrible fight and Tambu, not knowing what to do, wakes up Maiguru. Tambu, Maiguru, and Chido watch as Babamukuru calls Nyasha a whore and hits her twice. The second time, she hits him right back in the eye. Babamukuru attacks his daughter violently and she continues to fight back, while Maiguru pleads with her husband that if he must kill someone to kill her instead. She and Chido pull Babamukuru off Nyasha and hold him so he cannot kill her. Nyasha and Tambu retreat to the servants quarters and Nyasha smokes a cigarette. Tambu reconsiders the unyielding respect she used to have for her uncle. Chido brings the girls back inside and Maiguru tries to hug Nyasha, but she ignores her mother. For a week after the fight, Babamukuru stays away from the house and Nyasha retreats into herself. She stops eating again, so Tambu has lunch alone with her aunt. Maiguru confesses the pain she feels when she sees Nyasha and Babamukuru fighting. Tambu feels closer to Nyasha than ever and climbs into bed with her that night to cuddle until they fall asleep.

Babamukuru, Maiguru, Nyasha, and Tambu return home to the village before Christmas. Chido doesn’t accompany them because he has been invited to a friend’s ranch for the holiday, and Nyasha resents having to go. On the drive, Maiguru complains that they have brought too much food, and now she will have to “end up slaving for everybody” cooking all of it. Tambu looks at her former home through different eyes. She is suddenly aware the squalor she used to live in. She cleans the latrine because it is too filthy to use, and even then it is not clean enough. To Babamukuru’s chagrin, he discovers that Jeremiah has left the homestead with Takesure (his distant cousin) who is staying at the house with Lucia (Tambu’s mother’s sister), despite Babamukuru’s order for the couple to leave. Lucia is pregnant with Takesure’s child. Takesure already has two wives who live elsewhere, which is why Babamukuru does not approve of him living in the homestead. Jeremiah had agreed to send both Takesure and Lucia away, but he has clearly not done so. Netsai reports that, in addition, Tambu’s mother is pregnant and has been ill and unable to work for some time. However, when Tambu visits her bedridden mother, she observes that her mother actually looks quite strong.

Thomas and Gladys show up unexpectedly with their family, which upsets the sleeping arrangements in the small house. All the unmarried women end up sleeping in the kitchen together for the two-week visit. There are twenty-four people in the homestead, and the women are saddled with unending housework in order to take care of all the men and children. The rationing of food becomes impossible, and, despite Ma’Shingayi’s best efforts, the meat that could not fit in the refrigerator turns green. However, she refuses to throw away the rotten meat, so the women have to eat it while the men feast on the refrigerated portion.

Just after New Year’s Day, Babamukuru calls the men into a meeting to determine the fate of Takesure, and the women listen at the door. A battle ensues between Lucia and Tambu’s mother, who believe that Babamukuru is wrong to demand that Lucia and Takesure leave. Maiguru claims that since she was not born into this family, it is not her concern, and refuses to stick up for Lucia. After Maiguru leaves, Ma’Shingayi goes on a hysterical tirade about the injustices of her life. She is furious with Maiguru, whom she believes killed Nhamo. She accuses her sister-in-law of “stealing other people’s children because she could only produce two of her own, and you can’t call those two people.” She accuses Lucia of having sex with Jeremiah and Takesure at the same time, and curses Tambu for following Maiguru around like she can do no wrong.

Lucia overhears Takesure accusing her of witchcraft to Babamukuru during the counsel meeting, so she storms in and tweaks his ear, defending herself. She says, “I shall leave this home of yours, Babamukuru, and I shall take my sister with me.” She claims that the reason she refused to leave earlier was because she had to defend her sister against Jeremiah. After Lucia leaves in a huff, Jeremiah suggests bringing a witchdoctor into the house to perform a ceremony and rid the household of evil. Babamukuru is incredulous at this suggestion. He believes that the family’s misfortunes are the result of Jeremiah and Ma’Shingayi never having an official wedding and “living in sin.” The next morning, Tambu overhears Tete Gladys and Maiguru laughing about how ridiculous the men are.

Chapter 8-10


Summary

The preparations for Jeremiah and Ma’Shingayi’s wedding begin, and Tambu becomes extremely anxious. She grows resentful of Babamukuru for “having devised this plot which made such a joke of my parents, my home and myself.” She can feel her anger against Babamukuru rising up inside herself and yet, squashes it back down because she considers him to be Godlike and therefore, infallible. She amuses herself by making clay pots for fun with Nyasha. When Babamukuru goes back to the mission with Maiguru and Nyasha, he leaves Tambu at the homestead to help with the wedding preparations. Lucia continues trying to convince Ma’Shingayi to leave the homestead with her, but Ma’Shingayi has reservations. She says, “What I have endured for nineteen years I can endure for another nineteen, and nineteen more if need be.” Meanwhile, Tambu and Lucia fix the damaged roof but when Babamukuru comes to collect Tambu and take her back to the mission, Jeremiah takes credit for it.

Back at the mission, Tambu continues to be an “exemplary young lady” while Nyasha keeps disappointing her father. Ma’Shingayi comes to the mission hospital to give birth, accompanied by Lucia. Lucia takes the opportunity to pester Babamukuru about Takesure and it becomes clear that she hopes to stay at the mission and get a job there. Much to everyone’s surprise, Babamukuru does find Lucia a job cooking food at the girls’ hostel. She also begins to go to Grade One classes in the evening. This once again changes the way Tambu views her uncle, once again.

Meanwhile, Nyasha, Maiguru, and Tambu help Ma’Shingayi plan the wedding. Nyasha takes on the task of organizing almost everything, including shopping for material to make a dress. Tambu is offended by the frenzy, feeling that it reduces her parents “to the level of the stars of a comic show, the entertainers.” On the night that Tambu is supposed to return home to help start wedding preparations, she hides in the girls’ hostel. The next morning, Tambu is depressed, unable to get out of bed, and apologizes to her uncle, refusing to go to the wedding. Babamukuru is furious, of course, but eventually the rest of the family goes to the homestead and Tambu is allowed to stay at the mission. After the family returns, Babamukuru punishes Tambu with fifteen lashes and two weeks of maid’s work. Tambu finds a certain measure of satisfaction in her punishment, because it is the result of having stood up for herself.

Lucia visits with her new baby, Farai, and stands up to Babamukuru, insisting that he should not be punishing Tambu so severely, and Maiguru agrees with her. After Lucia leaves, Maiguru continues to argue with her husband, finally saying what has been on her mind for some time: “When I keep quiet you think I am enjoying it. So today I am telling you I am not happy. I am not happy any more in this house.” Babamukuru reacts by telling her to go wherever she wants. Nyasha predicts that her mother won’t leave, but she is wrong. Maiguru departs by bus the next morning. Tambu is surprised by how much this pleases Nyasha, since her cousin points out, “there was a difference between people deserting their daughters and people saving themselves.” She sees hope in her mother’s actions, since now she can foresee her own emancipation from Babamukuru’s rule. Five days later, Maiguru returns, much happier and refreshed.

Just before Tambu’s Grade Seven examinations, nuns visit the mission school to recruit students to attend a Catholic convent school called Sacred Heart. To her surprise, Tambu is offered a generous scholarship to attend. However, Nyasha thinks she will be brainwashed by the nuns. Meanwhile, Babamukuru refuses to let Tambu go, thinking that she will go astray. Maiguru uses her newfound confidence to speak up for Tambu, pointing out that in the 1950s, when she went to school, “people were prejudiced against educated women,” and argues that it is high time that things changed.

Babamukuru takes Tambu back to the homestead for Christmas alone, since Maiguru has refused to “spend another Christmas catering for a family of two dozen”. Babamukuru commutes between the mission and the homestead for weeks, and sometimes brings Nyasha and Maiguru with him. Tambu eavesdrops on a conversation between Babamukuru and Jeremiah, in which Babamukuru reveals that he is going to allow Tambu to go to the convent school. Excited, Tambu discusses this development with her mother, who becomes visibly depressed at the prospect of losing her child again. She won’t eat or do any work; and the new baby, Dambudzo, develops diarrhea. Jeremiah sends for Lucia, who forces her sister to get up, bathe, eat meat stew, and take care of her baby.

After the holidays, Tambu returns to the mission. Her old friends, Maidei and Jocelyn, are no longer kind to her and show resentment that she is leaving to go to a “white” convent school. Back at the house, Nyasha refuses to eat. After Babamukuru commands her to eat all the food on her plate, she gobbles it down quickly and then goes to the bathroom to vomit. She confesses to Tambu that after she leaves, “there won’t be anyone to laugh with.” She worries about facing her father alone. When it is time to go to Sacred Heart, Babamukuru, Maiguru, and Nyasha all drive Tambu to the convent. The building and grounds are impossibly beautiful and well groomed, but Babamukuru is clearly on edge upon seeing the entirely white student body. A nun shows them to the room where “the Africans” will be sleeping – there are six beds crammed into a space for four.

As the semester progresses, Tambu throws herself into her studies. She does not keep in good touch with Nyasha, though Nyasha writes her many letters. One letter in particular is very emotional, revealing that Nyasha does not get along with the girls at school or with her father. In the following letter, she informs Tambu that she has “embarked on a diet,” and after that, her letters stop coming as regularly. Tambu is so busy with her new activities and school work that she barely notices. When Tambu returns to the mission for a night, she notices a definite change in Nyasha, who has “grown skeletal.” She shovels food into her mouth and then vomits. While Babamukuru wants Tambu to return to the convent the next day, she feels she cannot leave her cousin in this state. She is right; that evening, Nyasha flies into a suicidal rage.

Babamukuru agrees to take Nyasha to a white psychiatrist in the city of Salisbury. Unfortunately, that psychiatrist claims that “Africans did not suffer in the way [he] … described,” and almost convinces Babamukuru to just take Nyasha home and punish her. Later, a second psychiatrist recognizes that Nyasha needs to be put in a clinic for several weeks for observation and recovery. While she is there, Babamukuru takes Tambu back to the homestead, where Ma’Shingayi is adamant that Nyasha is being killed by her “Englishness,” and warns Tambu to watch out for it. Tambu tries to banish her suspicion, but the narrator acknowledges that it stays with her. She shares that as she gets older, “quietly, unobtrusively and extremely fitfully, something in my mind began to assert itself, to question things and refuse to be brainwashed, bringing me to this time when I can set down this story.”

                Conclusion:

Nervous Condition discusses African Modernism and exposes the world to the Culture, and Family dynamics of African Modernism. It expresses the importance of education in the African Modernism Society and a woman’s place in their world is far from equal especially when trying to transition her lifestyle from poverty into becoming established in the African World. Displays how the African woman is or was viewed in African Modernism at that time .

The post Write up on Tsitsi Dangarembga’s Nervous Conditions appeared first on DayDreamin’ Comics.

]]>
https://ddcomics.org/2025/05/03/write-up-on-tsitsi-dangarembgas-nervous-conditions/feed/ 0 5013
Write up on Tech Geek History: Pascal Compliers https://ddcomics.org/2025/05/03/write-up-on-tech-geek-history-pascal-compliers/ https://ddcomics.org/2025/05/03/write-up-on-tech-geek-history-pascal-compliers/#respond Sat, 03 May 2025 09:10:32 +0000 https://ddcomics.org/?p=5011 Background of Study :: History of Pascal :: The language Component Pascal was the culmination of several decades of research. It was the youngest member of the Algol family of languages. Algol, defined in 1960, was the first high-level language with a readable, structured, and systematically defined syntax. In the late sixties, several proposals for […]

The post Write up on Tech Geek History: Pascal Compliers appeared first on DayDreamin’ Comics.

]]>
Background of Study

:: History of Pascal ::

The language Component Pascal was the culmination of several decades of research. It was the youngest member of the Algol family of languages. Algol, defined in 1960, was the first high-level language with a readable, structured, and systematically defined syntax.

In the late sixties, several proposals for an evolutionary successor to Algol were developed. The most successful one was Pascal, defined in 1970 by Prof. Niklaus Wirth at ETH Zurich, the Swiss Federal Institute of Technology. His [Prof. Niklaus] principle objectives for Pascal were for the language to be efficient to implement and run, allow for the development of well structured and well organized programs, and to serve as a vehicle for the teaching of the important concepts of computer programming. Pascal, which was named after the mathematician Blasé Pascal, is a direct descendent from ALGOL 60, which Wirth helped develop. Pascal also draws programming components from ALGOL 68 and ALGOL-W. The original published definition for the Pascal language appeared in 1971 with latter revisions published in 1973. It was designed to teach programming techniques and topics to college students and was the language of choice to do so from the late 1960’s to the late 1980’s.

Pascal received a big boost when ETH released a Pascal compiler that produced a simple intermediate code for a virtual machine (P-code), instead of true native code for a particular machine. This simplified porting Pascal to other processor architectures considerably, because only a new P-code interpreter needed be written for this purpose, not a whole new compiler. One of these projects had been undertaken at the University of California, San Diego. Remarkably, this implementation (UCSD Pascal) didn’t require a large and expensive mainframe computer, it ran on the then new Apple II personal computers. This gave Pascal a second important boost. The third one came when Borland released Turbo Pascal, a fast and inexpensive compiler, and integrated development environment for the IBM PC. Later, Borland revived its version of Pascal when it introduced the rapid application development environment Delphi.

Pascal has greatly influenced the design and evolution of many other languages, from Ada to Visual Basic.

Significance of Study

:: Application Areas ::

Pascal contains some significant language features that allow it to used as a powerful learning tool in introducing structured programming techniques:

  • Built in Data Types- Pascal contains it’s own built in data types of Integer, Real, Character, and Boolean.
  • User defined Data Types – Has the ability to define scalar types as well as sub-ranges of those data types.
  • Provides a defined set of Data Structures- These data structures include Arrays, Records, Files and Sets.
  • Has a strong data typing element – Pascal compliers can diagnose an incompatible assignment of one type to a variable to another type.
  • Supports Structured Programming – This is accomplished through the use of subprograms called procedures and functions.
  • Simplicity and Expressivity – Because the language is simple and expressive in nature it allows for effective teaching of computer programming techniques.

The Pascal Language Pascal was originally designed by Niklaus Wirth with two primary goals: to teach programming as a systematic discipline, and to implement programs in a reliable and efficient way. But there are other reasons for the widespread interest in Pascal as a general purpose programming language and as a system program implementation language. • • • • Pascal, a relatively modern language, has benefited from many earlier languages (such as ALGOL) and is forming the basis of several new-ones. The key emphasis of Pascal is its role as a higher level language ; that is, a language providing useful abstract tools for specifying data structures and algorithms, independent of the underlying implementation. The user need not be concerned with the repre sentation of data (the number of bytes per variable, organization of arrays, address size, and so on). The programmer can more accurately specify the characteristics of variables, such as the range of values allowed (V AR I: 0 .. 99) or decide whether 1-3 to trade space for time in accessing variable components. (PACKED keyword) IBM has added several goals to this list:

  1. 2. 3. IBM Personal Computer Pascal is designed to be a systems implementation language, especially suitable for writing compilers, interpreters, operating systems, and so on. Generating efficient code is paramount. The various language extensions, and the global optimizer phase (pass two of the compiler) all work toward minimizing the time and space needed by compiled programs. Operations that are done easily in assembly language should be easy to do in IBM Personal Computer Pascal.
https://bitsavers.org/pdf/ibm/pc/languages/IBM_Pascal_Compiler_Aug81.pdf

Each line defines a computer instruction consisting of an operation code possibly followed by some arguments. The code becomes a bit more readable if were place the operation codes by readable names and enclose the arguments in parentheses:

Program (1, 2, 5, 1)

LocalVar(3)

 Constant(1)

Simple Assign End Program

A system program, known as a compiler, performs the translation from Pascal to machine code. Compilers play a crucial role in software development: They enable you to ignore the complicated instruction sets of computers and write programs in a readable notation. Compilers also detect numerous programming errors even before you begin testing your programs. However, you can ignore the code generated by a compiler only if you know that the compiler never makes a mistake! If a compiler does not always work, programming becomes extremely complicated. In that case, you will discover that the Pascal report no longer defines exactly what your program does. This is obviously unacceptable. So the following design rule is essential:

Rule 1.1: A compiler must be error-free. This requirement is quite a challenge to the compiler designer when you consider that a compiler is a program of several thousand lines. Compiler writing forces you to apply very systematic methods of program design, testing, and documentation.

 It is one of the best educational experiences for a software engineer. The input to a compiler is a program text.

 The first task of the compiler is to read the program text character by character and recognize the symbols of the language. The compiler will, for example, read the characters program

WHAT A COMPILER DOES

recognize them as the single word program. At this point, the compiler views the previous program example as the following sequence of symbols: program name semicolon var name x colon name integer semicolon begin name x becomes numeral 1 end period This phase of compilation is called lexical analysis. (The word lexical means “pertaining to the words or vocabulary of a language.’’) The next task of the compiler is to check that the symbols occurring the right order. For example, the compiler recognizes the sentence xi=1 as.an assignment statement.

 But if you write x=1 instead, the compiler will indicate that this is not a valid statement. This phase of compilation is called syntax analysis. (The word syntax means “‘the structure of the word order in a sentence.’’) The syntax analysis is concerned only with the sequence of symbols in sentences. As long as a sentence consists of a name followed by the :=

symbol and an expression, it will be recognized as an assignment statement. But even though the syntax of the statement is correct, it may still be meaning less, as in the following example: yirl which refers to an undefined variable y. The assignment statement x ‘= true is also meaningless because the variable x and the value true are of different types (integer and Boolean). The phase of compilation that detects meaning less sentences such as these is called semantic analysis. (The word semantics means “‘the study of meaning.’’) As these examples show, the compiler must perform two kinds of se mantic checks: First, the compiler must make sure that the names used in a program refer to known objects: either predefined standard objects, such as the type integer, or objects that are defined in the program, such as the variable x. The problem is to recognize a definition such as var x: integer;

WHAT A COMPILER DOES

and determine in which part of the program the object x can be used. This task is called scope analysis. (The word scope means “‘the extent of application.”) During this part of the compilation, the compiler will indicate if the program uses undefined names, such as y, or introduces ambiguous names in definitions, such as var x: integer; x: integer;

Second, the compiler must check that the operands are of compatible types. This task is called type analysis. When you compile a new program for the first time, the compiler nearly always finds some errors in it. It will often require several cycles of editing and recompilation before the compiler accepts the program as  correct.

So, in designing a compiler, you must keep in mind that most of the time it will be used to compile incorrect programs! If there are many errors in a program, it is convenient to output the error messages in a file which can be inspected or printed after the compilation. However, the compiler will be able to complete this file and close it properly only if the compilation itself terminates properly. If the compilation of an incorrect program causes a run-time failure, such as an arithmetic overflow, the error messages will be lost and you will have to guess what happened. To avoid this situation, we must impose the following design requirement:

Rule 1.2: A compilation must always terminate, no matter what the input looks like. The easiest way to satisfy this requirement is to terminate the compilation when the first error has been detected. The user must then remove this error and recompile the program to find the next error, and so on. Since a compilation may take several minutes, this method is just too slow. To speed up the program development process, we must add another design requirement: .

 Rule 1.3: A compiler should attempt to find as many errors as possible during a single compilation. As you will see later, this goal is not easy to achieve. There is one exception to the rule that a compilation must always Terminate: If a program is so big that the compiler exceeds the limits

The part of a compiler that performs lexical analysis is called the scanner. This chapter describes the Pascal— scanner (pass 1) and explains how it recognizes symbols in a program text and replaces them by a more convenient representation. Much of the discussion concerns the pro’ tem of searching for word symbols and names in a symbol table.

SOURCE TEXT The scanner reads a program text character by character. It uses a control character to indicate that it has reached the end of the source text const ETX = 38C; This is the Pascal  x notation for ASCII character number three, known as ETX (End of Text). When the scanner finds a character that cannot occur in any symbol, it reports the problem. A line number in the error message helps you locate the error in the program text and correct it. However, if an invisible character causes an error message, it is very confusing since you cannot see where the 28 Sec.

INTERMEDIATE CODE 29 problem is by looking at the printed program text. To avoid this situation we must make sure that ‘“‘what you see is what the compiler gets.” In other words, the compiler must ignore all control characters (except NL and. ETX). The set of invisible characters is stored in a variable of type CharSet: type CharSet = set of char; var Invisible: CharSet; The scanner uses Algorithm 4.1 to input the next character and store it ina global variable named ch. This procedure illustrates the use of set types in a compiler. Later, we will see many other examples of this. procedure NextChar; begin if EOF then ch := ETX else begin Read(ch); if ch in Invisible then NextChar end end;

Algorithm  INTERMEDIATE CODE In the source text, a word symbol such as const consists of a sequence of letters, in this case c o n s t. This representation of symbols is very bulky and awkward to work with in Pascal. If you store a symbol as a string of characters var Symbol: String; you can easily test, for example, if the symbol is the word const: if Symbol = ’const’ then… But you cannot easily form sets of strings and ask whether the current symbol is either const, type, var, or procedure. The use of symbol sets plays an important role in syntax analysis. To be able to define symbol sets, we must represent the symbols by simple values. These values should, however, have readable names to make the compiler understandable. What we need, then, is an enumerated type that introduces a name for each symbol in the language:

Linear Searching To illustrate how important efficient searching is in lexical analysis, very inefficient method called linear searching. The idea behind it is the simplest possible: The symbol table is organized as a linked list of records each describing one word. The list is unordered and is always searched from the beginning. New words can be inserted anywhere in the list.

Letter Indexing Well then, let’s improve things a bit by using a ‘‘thumb index’ of the words as in a dictionary. Instead of a single linked list we will use a separate list for each letter of the alphabet The first list will hold all words beginning with the letter “A”. The second list is for the letter ““B’’, and so on. The first letter of each word is used as an index in an array to locate the start of the corresponding list, Each list is unordered.

Conclusion

WHAT A COMPILER DOES

The only reasonable thing to do is to report this and stop the compilation. This is called a compilation failure. If the compiler finds no formal errors in a program, it proceeds to the last phase of compilation, code generation. In this phase, the compiler determines the amount of storage needed for the code and variables of the program and emits final instructions. The main difficulty is that most computers have very unsystematic instruction sets that are ill suited for automatic code generation. These, then, are the major tasks of a compiler:

Lexical analysis

 Syntax analysis

 Scope analysis

 Type analysis

Code generation

http://pascal.hansotten.com/uploads/pbh/brinch%20hansen%20on%20pascal%20compilers%20OCR.pdf

References:

http://pascal.hansotten.com/uploads/pbh/brinch%20hansen%20on%20pascal%20compilers%20OCR.pdf

The post Write up on Tech Geek History: Pascal Compliers appeared first on DayDreamin’ Comics.

]]>
https://ddcomics.org/2025/05/03/write-up-on-tech-geek-history-pascal-compliers/feed/ 0 5011
Write up on Tech Geek History: LISP Interupters and Lambda FUNCTION EXPLAINED https://ddcomics.org/2025/05/03/write-up-on-tech-geek-history-lisp-interupters-and-lambda-function-explained/ https://ddcomics.org/2025/05/03/write-up-on-tech-geek-history-lisp-interupters-and-lambda-function-explained/#respond Sat, 03 May 2025 09:06:18 +0000 https://ddcomics.org/?p=5008 Significance of the Study Prolog – Logic Programming – Based on Predicate Logic – Working with predicates –  Computation is reasoning, initiated by a query  – Popular in natural language processing • LISP – Functional Programming – Based on Lambda Calculus – Working with functions  – Computation is evaluation – Used in Artificial Intelligence – […]

The post Write up on Tech Geek History: LISP Interupters and Lambda FUNCTION EXPLAINED appeared first on DayDreamin’ Comics.

]]>
Significance of the Study

Prolog – Logic Programming

– Based on Predicate Logic –

Working with predicates –

 Computation is reasoning, initiated by a query

 – Popular in natural language processing

• LISP – Functional Programming – Based on Lambda Calculus

– Working with functions

 – Computation is evaluation

– Used in Artificial Intelligence –

Theory based on Lambda Calculus by Alonzo Church (1930) – l-calculus: theory of functions as formulas – Easier manipulation of functions using expressions

LISP interpreter: An interactive environment, always evaluating input

The heart of the Lisp interpreter is the “read-eval-print” loop. That is, the interpreter does the following three jobs over and over:

  • read an input expression
  • evaluate the expression
  • print the results

This loop can be written in Lisp itself very simply:

(loop (print (eval (read)))

Of course, this doesn’t take into account error handling, multiple values, and so on, but much of what Lisp does, including some things that seem unintuitive, can be understood by reasoning about the above three step process.

The Lisp Reader

The input to the Lisp reader is a sequence of characters. The output is a Lisp expression. The job of the reader is to convert objects in character world to objects in expression world.

In character world, there are no pointers, no lists, no symbols, just characters like Ab`, and (. That is, (A B (C D) E) is not a list, it is a sequence of parentheses, spaces, and letters. “abc” is not a string, it is a sequence of letters.

In expression world, there are no parentheses, no spaces, no quote marks, just atoms and lists. That is, (A B (C D) E) has no parentheses or spaces. It is a list of three atoms and a list. “abc” has no quote marks. It is a string with three characters.

The Common Lisp reader is quite complex (Steele has a full description), but it works roughly like this:

  • If the reader sees a character with read-macro function, it calls that function, and returns whatever expression that function returns. For example,  has a pre-defined read-macro function that basically says (list (quote quote) (read)). Thus, ‘abc becomes (quote abc).
  • If the reader sees a , it collects characters until it sees another , and creates a string object with the characters found between the string quotes. Thus, the 5 characters “abc” become the 3-character string with the characters ab, and c.
  • If the reader sees a digit (0 – 9), it collects the digits that follow, and creates the number those digits represent (base 10). Thus, the three characters 123 become the single number 123.
  • If the reader sees an alphabetic character, it collects characters until it sees a space or parenthesis, and then gets the symbol (using Lisp’s intern function) that has those characters (converted to upper case) as its name. Thus the three characters abc become the single unique symbol ABC.
  • If the reader sees a left parenthesis, it reads more characters, turning them into expressions, using all these rules, until it sees a right parenthesis. Then it returns the list of expressions read. Thus, the 7 characters (A B C) become the 3 element list (A B C).

The Lisp Evaluator

The Lisp evaluator takes an expression and returns an expression. The expression returned is called the value of the expression evaluated. [I’ll ignore expressions that return multiple values here.]

The rules for evaluation are surprisingly simple. Graphically, it looks like this:

First, there are two rules for atoms:

  • The value of a symbol is looked up in the current lexical environments. If none is found, symbol-value is called. If that fails, there’s an error (unbound variable).
  • The value of any other kind of atom is the atom itself.

There are three rules for lists that start with a symbol. If they don’t work, there’s an error. The rules are:

  • If the symbol names a special function, use the rules for evaluation stored with the special function.
  • If the symbol has a macro function attached, apply the macro function to the rest of the list, and evaluate the result.
  • If the symbol has a normal function attached, evaluate the other elements in the list, and apply the function to a list of the values returned. The value the function returns is the final value.

There is one other case for lists, but it appears rarely in modern code:

  • If the list has the form ((lambda (vars) exps) args), then evaluate the arguments, and apply the lambda function to the list of results. The value the lambda returns is the final value.

Anything that can be done with a lambda can also be done with either let or destructuring-bind.

The Lisp Printer

The input to the Lisp printer is a Lisp expression. The output is a sequence of characters. The job of the printer is to convert objects in expression world to objects in character world.

The printer’s rules are pretty simple. They all involve taking an expression and printing a sequence of characters:

  • If the expression is an string, print  then the characters in the string, then another .
  • If the expression is a symbol, print the characters in the symbol’s name.
  • If the expression is a number, print the digits representing that numbers (base 10).
  • If the expression is a list, print a left parenthesis, then print each element in the list, with a space after each element but the last, then print a right parenthesis.

There are also rules for printing structures, special characters, and so on.

The purpose of the above rules is to make the following as true as possible:

(equal exp (read-from-string (write-to-string exp)))

Often, however, that is not what we want. For example, we probably want the string “Pick an option:” to appear on the screen as

Pick an option:

not

“Pick an option:”

The latter is correct in so far as, if Lisp read it, it would see a string, but we want people to read this message, not Lisp.

Use functions like write-stringprinc, and the ~A format command to print things “for people” rather than for Lisp. However, don’t use these functions for printing debugging information. The information these functions hide for readability may be exactly what you need for debugging.

https://courses.cs.northwestern.edu/325/readings/interpreter.html#:~:text=The%20heart%20of%20the%20Lisp,print%20the%20results

Closures

Closure-Oriented Programming

One of the conclusions that we reached was that the “object” need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele on the design of Scheme

Sometimes it’s called a closure, other times a saved lexical environment. Or, as some of us like to say, let over lambda. Whatever terminology you use, mastering this concept of a closure is the first step to becoming a professional lisp programmer. In fact, this skill is vital for the proper use of many modern programming languages, even ones that don’t explicitly contain let or lambda, such as Perl or Javascript.

Closures are one of those few curious concepts that are paradoxically difficult because they are so simple. Once a programmer becomes used to a complex solution to a problem, simple solutions to the same problem feel incomplete and uncomfortable. But, as we will soon see, closures can be a simpler, more direct solution to the problem of how to organise data and code than objects. Even more important than their simplicity, closures represent a better abstraction to use when constructing macros—the topic of this book.

The fact that we can build objects and classes with our closure primitives doesn’t mean that object systems are useless to lisp programmers. Far from it. In fact, COMMON LISP includes one of the most powerful object systems ever devised: CLOS, the COMMON LISP Object System. Although I am very impressed with the flexibility and features of CLOS, I seldom find a need to use its more advanced features1, thanks to assignable value cells and good old lambda expressions.

Environments and Extent

What Steele means by assignable value cells is an environment for storing pointers to data where the environment is subject to something called indefinite extent. This is a fancy way of saying that we can continue to refer to such an environment at any time in the future. Once we allocate this environment, it and its references are there to stay as long as we need them. Consider this C function:

#include <stdlib.h>

int *environment_with_indefinite_extent(int input) {

  int *a = malloc(sizeof(int));

  *a = input;

  return a;

}

After we call this function and receive the pointer it returns, we can continue to refer to the allocated memory indefinitely. In C, new environments are created when invoking a function, but C programmers know to malloc() the required memory when returning it for use outside the function.

By contrast, the example below is flawed. C programmers consider a to be automatically collected when the function returns because the environment is allocated on the stack. In other words, according to lisp programmers, a is allocated with temporary extent.

int *environment_with_temporary_extent(int input) {

  int a = input;

  return &a;

}

The difference between C environments and lisp environments is that unless you explicitly tell lisp otherwise it always assumes you mean to use indefinite extent. In other words, lisp always assumes you mean to call malloc() as above. It can be argued that this is inherently less efficient than using temporary extent, but the benefits almost always exceed the marginal performance costs. What’s more, lisp can often determine when data can safely be allocated on the stack and will do so automatically. You can even use declarations to tell lisp to do this explicitly.

But because of lisp’s dynamic nature, it doesn’t have explicit pointer values or types like C. This can be confusing if you, as a C programmer, are used to casting pointers and values to indicate types. Lisp thinks about all this slightly differently. In lisp, a handy mantra is the following:

Variables don’t have types. Only values have types.

Still, we have to return something to hold pointers. In lisp there are many data structures that can store pointers. One of the most favoured by lisp programmers is a simple structure: the cons cell. Each cons cell holds exactly two pointers, affectionately called car and cdr. When environment-with-indefinite-extent is invoked, a cons cell will be returned with the car pointing to whatever was passed as input and the cdr pointing to nil. And, most importantly, this cons cell (and with it the pointer to input) has indefinite extent so we can continue to refer to it as long as we need to:

(defun environment-with-indefinite-extent (input)

  (cons input nil))

The efficiency disadvantages of indefinite extent are approaching irrelevance as the state of the art in lisp compilation technology improves. Environments and extent are closely related to closures and more will be said about them throughout this chapter.

Lexical and Dynamic Scope

The technical term for where to consider a variable reference valid is scope. The most common type of scope in modern languages is called lexical scope. When a fragment of code is surrounded by the lexical binding of a variable, that variable is said to be in the lexical scope of the binding. The let form, which is one of the most common ways to create bindings, can introduce these lexically scoped variables:

* (let ((x 2))

    x)

2

The x inside the body of the let form was accessed through lexical scope. Similarly, arguments to functions defined by lambda or defun are also lexically bound variables inside the text of the function definition. Lexical variables are variables that can only be accessed by code appearing inside the context of, for instance, the above let form. Because lexical scoping is such an intuitive way to limit the scope of access to a variable, it can appear to be the only way. Are there any other possibilities for scoping?

As useful as the combination of indefinite extent and lexical scoping turns out to be, it has until recently not been used to its fullest extent in mainstream programming languages. The first implementation was by Steve Russell for Lisp 1.5[HISTORY-OF-LISP] and was subsequently designed directly into languages like Algol-60, Scheme, and COMMON LISP. Despite this long and fruitful history, the numerous advantages of lexical scoping are only slowly being taken up by many Blubs.

Although the scoping methods provided by C-like languages are limited, C programmers need to program across different environments too. To do so, they often use an imprecisely defined scoping known as pointer scope. Pointer scope is famous for its difficulty to debug, numerous security risks, and, somewhat artificially, its efficiency. The idea behind pointer scoping is to define a domain specific language for controlling the registers and memory of a Von Neumman machine similar to most modern CPUs[PAIP-PIX], then to use this language to access and manipulate data-structures with fairly direct commands to the CPU running the program. Pointer scoping was necessary for performance reasons before decent lisp compilers were invented but is now regarded as a problem with, rather than a feature of, modern programming languages.

Even though lisp programmers seldom think in terms of pointers, the understanding of pointer scoping is very valuable in the construction of efficient lisp code.

#include <stdio.h>

void pointer_scope_test() {

  int a;

  scanf(“%d”, &a);

}

In the above function we use the C & operator to give the actual address in memory of our local variable a to the scanf function so it knows where to write the data it scans. Lexical scoping in lisp forbids us from implementing this directly. In lisp, we would likely pass an anonymous function to a hypothetical lisp scanf function, allowing it to set our lexical variable a even though scanf is defined outside our lexical scope:

(let (a)

  (scanf “%d” (lambda (v) (setf a v))))

Lexical scope is the enabling feature for closures. In fact, closures are so related to this concept of lexical scope that they are often referred to more specifically as lexical closures to distinguish them from other types of closures. Unless otherwise noted, all closures in this book are lexical.

In addition to lexical scope, COMMON LISP provides dynamic scope. This is lisp slang for the combination of temporary extent and global scope. Dynamic scoping is a type of scoping that is unique to lisp in that it offers a very different behaviour but shares an identical syntax with lexical scope. In COMMON LISP we deliberately choose to call attention to variables accessed with dynamic scope by calling them special variables. These special variables can be defined with defvar. Some programmers follow a convention of prefixing and postfixing special variable names with asterisks, like *temp-special*. This is called the earmuff convention.

Special variable declarations look like this:

(defvar temp-special)

When defined like this, temp-special will be designated special2 but will not be initialised with a value. In this state, a special variable is said to be unbound. Only special variables can be unbound—lexical variables are always bound and thus always have values. Another way of thinking of this is that by default all symbols represent lexically unbound variables. Just as with lexical variables, we can assign a value to special variables with setq or setf. Some lisps, like Scheme, do not have dynamic scope. Others, like EuLisp[SMALL-PIECES-P46], use different syntax for accessing lexical versus special variables. But in COMMON LISP the syntax is shared. Many lispers consider this a feature. Here we assign a value to our special variable temp-special:

(setq temp-special 1)

So far, this special variable doesn’t seem that special. It seems to be just another variable, bound in some sort of global namespace. This is because we have only bound it once—its default special global binding. Special variables are most interesting when they are re-bound, or shadowed, by new environments. If we define a function that simply evaluates and returns temp-special:

(defun temp-special-returner ()

  temp-special)

This function can be used to examine the value that lisp evaluates temp-special to be at the moment in time when it was called:

* (temp-special-returner)

1

This is sometimes referred to as evaluating the form in a null lexical environment. The null lexical environment obviously doesn’t contain any lexical bindings. Here the value of temp-special returned is that of its global special value, 1. But if we evaluate it in a non-null lexical environment—one that contains a binding for our special variable—the specialness of temp-special reveals itself3:

* (let ((temp-special 2))

    (temp-special-returner))

2

Notice that the value 2 was returned, meaning that the temp-special value was taken from our let environment, not its global special value. If this still does not seem interesting, see how this cannot be done in most other conventional programming languages as exemplified by this piece of Blub pseudo-code:

int global_var = 0;

function whatever() {

  int global_var = 1;

  do_stuff_that_uses_global_var();

}

function do_stuff_that_uses_global_var() {

  // global_var is 0

}

While the memory locations or register assignments for lexical bindings are known at compile-time4, special variable bindings are determined at run-time—in a sense. Thanks to a clever trick, special variables aren’t as inefficient as they seem. A special variable actually always does refer to the same location in memory. When you use let to bind a special variable, you are actually compiling in code that will store a copy of the variable, over-write the memory location with a new value, evaluate the forms in the let body, and, finally, restore the original value from the copy.

Special variables are perpetually associated with the symbol used to name them. The location in memory referred to by a special variable is called the symbol-value cell of a symbol. This is in direct contrast to lexical variables. Lexical variables are only indicated with symbols at compile-time. Because lexical variables can only be accessed from inside the lexical scope of their bindings, the compiler has no reason to even remember the symbols that were used to reference lexical variables so it will remove them from compiled code.

Although COMMON LISP does offer the invaluable feature of dynamic scope, lexical variables are the most common. Dynamic scoping used to be a defining feature of lisp but has, since COMMON LISP, been almost completely replaced by lexical scope. Since lexical scoping enables things like lexical closures (which we examine shortly), as well as more effective compiler optimisations, the superseding of dynamic scope is mostly seen as a good thing. However, the designers of COMMON LISP have left us a very transparent window into the world of dynamic scoping, now acknowledged for what it really is: special.

Let It Be Lambda

Let is a lisp special form for creating an environment with names (bindings) initialised to the results of evaluating corresponding forms. These names are available to the code inside the let body while its forms are evaluated consecutively, returning the result of the final form. Although what let does is unambiguous, how it does it is deliberately left unspecified. What let does is separated from how it does it. Somehow, let needs to provide a data structure for storing pointers to values.

Cons cells are undeniably useful for holding pointers, as we saw above, but there are numerous structures that can be used. One of the best ways to store pointers in lisp is to let lisp take care of it for you with the let form. With let you only have to name (bind) these pointers and lisp will figure out how best to store them for you. Sometimes we can help the compiler make this more efficient by giving it extra bits of information in the form of declarations:

(defun register-allocated-fixnum ()

  (declare (optimize (speed 3) (safety 0)))

  (let ((acc 0))

    (loop for i from 1 to 100 do

      (incf (the fixnum acc)

            (the fixnum i)))

    acc))

For example, in register-allocated-fixnum we provide some hints to the compiler that allow it to sum the integers from 1 to 100 very efficiently. When compiled, this function will allocate the data in registers, eliminating the need for pointers altogether. Even though it seems we’ve asked lisp to create an indefinite extent environment to hold acc and i, a lisp compiler will be able to optimise this function by storing the values solely in CPU registers. The result might be this machine code:

; 090CEB52:       31C9             XOR ECX, ECX

;       54:       B804000000       MOV EAX, 4

;       59:       EB05             JMP L1

;       5B: L0:   01C1             ADD ECX, EAX

;       5D:       83C004           ADD EAX, 4

;       60: L1:   3D90010000       CMP EAX, 400

;       65:       7EF4             JLE L0

Notice that 4 represents 1 and 400 represents 100 because fixnums are shifted by two bits in compiled code. This has to do with tagging, a way to pretend that something is a pointer but actually store data inside it. Our lisp compiler’s tagging scheme has the nice benefit that no shifting needs to occur to index word aligned memory

But if lisp determines that you might want to refer to this environment later on it will have to use something less transient than a register. A common structure for storing pointers in environments is an array. If each environment has an array and all the variable references enclosed in that environment are just references into this array, we have an efficient environment with potentially indefinite extent.

As mentioned above, let will return the evaluation of the last form in its body. This is common for many lisp special forms and macros, so common that this pattern is often referred to as an implicit progn due to the progn special form designed to do nothing but this5. Sometimes the most valuable thing to have a let form return is an anonymous function which takes advantage of the lexical environment supplied by the let form. To create these functions in lisp we use lambda.

Lambda is a simple concept that can be intimidating because of its flexibility and importance. The lambda from lisp and scheme owes its roots to Alonzo Church’s logic system but has evolved and adapted into its altogether own lisp specification. Lambda is a concise way to repeatably assign temporary names (bindings) to values for a specific lexical context and underlies lisp’s concept of a function. A lisp function is very different from the mathematical function description that Church had in mind. This is because lambda has evolved as a powerful, practical tool at the hands of generations of lispers, stretching and extending it much further than early logicians could have foreseen.

Despite the reverence lisp programmers have for lambda, there is nothing inherently special about the notation. As we will see, lambda is just one of many possible ways to express this sort of variable naming. In particular, we will see that macros allow us to customise the renaming of variables in ways that are effectively impossible in other programming languages. But after exploring this, we will return to lambda and discover that it is very close to the optimal notation for expressing such naming. This is no accident. Church, as dated and irrelevant as he might seem to our modern programming environment, really was on to something. His mathematical notation, along with its numerous enhancements in the hands of generations of lisp professionals, has evolved into a flexible, general tool6.

Lambda is so useful that, like many of lisp’s features, most modern languages are beginning to import the idea from lisp into their own systems. Some language designers feel that lambda is too lengthy, instead using fn or some other abbreviation. On the other hand, some regard lambda as a concept so fundamental that obscuring it with a lesser name is next to heresy. In this book, although we will describe and explore many variations on lambda, we happily call it lambda, just as generations of lisp programmers before us.

But what is lisp’s lambda? First off, as with all names in lisp, lambda is a symbol. We can quote it, compare it, and store it in lists. Lambda only has a special meaning when it appears as the first element of a list. When it appears there, the list is referred to as a lambda form or as a function designator. But this form is not a function. This form is a list data structure that can be converted into a function using the function special form:

* (function ‘(lambda (x) (+ 1 x)))

#<Interpreted Function>

COMMON LISP provides us a convenience shortcut for this with the #’ (sharp-quote) read macro. Instead of writing function as above, for the same effect we can take advantage of this shortcut:

* #'(lambda (x) (+ 1 x))

#<Interpreted Function>

As a further convenience feature, lambda is also defined as a macro that expands into a call to the function special form above. The COMMON LISP ANSI standard requires[ANSI-CL-ISO-COMPATIBILITY] a lambda macro defined like so:

(defmacro lambda (&whole form &rest body)

  (declare (ignore body))

  `#’,form)

Ignore the ignore declaration for now7. This macro is just a simple way to automatically apply the function special form to your function designators. This macro allows us to evaluate function designators to create functions because they are expanded into sharp-quoted forms:

* (lambda (x) (+ 1 x))

#<Interpreted Function>

There are few good reasons to prefix your lambda forms with #’ thanks to the lambda macro. Because this book makes no effort to support pre-ANSI COMMON LISP environments, backwards compatibility reasons are easily rejected. But what about stylistic objections? Paul Graham, in ANSI COMMON LISP[GRAHAM-ANSI-CL], considers this macro, along with its brevity benefits, a “specious sort of elegance at best”. Graham’s objection seems to be that since you still need to sharp-quote functions referenced by symbols, the system seems asymmetric. However, I believe that not sharp-quoting lambda forms is actually a stylistic improvement because it highlights the asymmetry that exists in the second namespace specification. Using sharp-quote for symbols is for referring to the second namespace, whereas functions created by lambda forms are, of course, nameless.

Without even invoking the lambda macro, we can use lambda forms as the first argument in a function call. Just like when a symbol is found in this position and lisp assumes we are referencing the symbol-function cell of the symbol, if a lambda form is found, it is assumed to represent an anonymous function:

* ((lambda (x) (+ 1 x)) 2)

But note that just as you can’t call a function to dynamically return the symbol to be used in a regular function call, you can’t call a function to return a lambda form in the function position. For both of these tasks, use either funcall or apply.

A benefit of lambda expressions that is largely foreign to functions in C and other languages is that lisp compilers can often optimise them out of existence completely. For example, although compiler-test looks like it applies an increment function to the number 2 and returns the result, a decent compiler will be smart enough to know that this function always returns the value 3 and will simply return that number directly, invoking no functions in the process. This is called lambda folding:

(defun compiler-test ()

  (funcall

    (lambda (x) (+ 1 x))

    2))

An important efficiency observation is that a compiled lambda form is a constant form. This means that after your program is compiled, all references to that function are simply pointers to a chunk of machine code. This pointer can be returned from functions and embedded in new environments, all with no function creation overhead. The overhead was absorbed when the program was compiled. In other words, a function that returns another function will simply be a constant time pointer return function:

(defun lambda-returner ()

  (lambda (x) (+ 1 x)))

This is in direct contrast to the let form, which is designed to create a new environment at run-time and as such is usually not a constant operation because of the garbage collection overhead implied by lexical closures, which are of indefinite extent.

(defun let-over-lambda-returner ()

  (let ((y 1))

    (lambda (x)

      (incf y x))))

Every time let-over-lambda-returner is invoked, it must create a new environment, embed the constant pointer to the code represented by the lambda form into this new environment, then return the resulting closure. We can use time to see just how small this environment is:

* (progn

    (compile ‘let-over-lambda-returner)

    (time (let-over-lambda-returner)))

; Evaluation took:

;   …

;   24 bytes consed.

;

#<Closure Over Function>

If you try to call compile on a closure, you will get an error saying you can’t compile functions defined in non-null lexical environments[CLTL2-P677]. You can’t compile closures, only the functions that create closures. When you compile a function that creates closures, the closures it creates will also be compiled[ON-LISP-P25].

The use of a let enclosing a lambda above is so important that we will spend the remainder of this chapter discussing the pattern and variations on it.

.

(lambda ()

  (let ((counter 0))

    (lambda () (incf counter))))

When the lambda over let over lambda is invoked, a new closure containing a counter binding will be created and returned. Remember that lambda expressions are constants: mere pointers to machine code. This expression is a simple bit of code that creates new environments to close over the inner lambda expression (which is itself a constant, compiled form), just as we were doing at the REPL.

With object systems, a piece of code that creates objects is called a class. But lambda over let over lambda is subtly different than the classes of many languages. While most languages require classes to be named, this pattern avoids naming altogether. Lambda over let over lambda forms can be called anonymous classes.

Although anonymous classes are often useful, we usually do name classes. The easiest way to give them names is to recognise that such classes are regular functions. How do we normally name functions? With the defun form, of course. After naming, the above anonymous class becomes:

(defun counter-class ()

  (let ((counter 0))

    (lambda () (incf counter))))

Where did the first lambda go? Defun supplies an implicit lambda around the forms in its body. When you write regular functions with defun they are still lambda forms underneath but this fact is hidden beneath the surface of the defun syntax.

BLOCK-SCANNER

(defun block-scanner (trigger-string)

  (let* ((trig (coerce trigger-string ‘list))

         (curr trig))

    (lambda (data-string)

      (let ((data (coerce data-string ‘list)))

        (dolist (c data)

          (if curr

            (setq curr

                  (if (char= (car curr) c)

                    (cdr curr) ; next char

                    trig))))   ; start over

        (not curr))))) ; return t if found

In order to motivate the use of closures, a realistic example is presented: block-scanner. The problem block-scanner solves is that for some forms of data transfer the data is delivered in groups (blocks) of uncertain sizes. These sizes are generally convenient for the underlying system but not for the application programmer, often being determined by things like operating system buffers, hard drive blocks, or network packets. Scanning a stream of data for a specific sequence requires more than just scanning each block as it comes in with a regular, stateless procedure. We need to keep state between the scanning of each block because it is possible that the sequence we are scanning for will be split between two (or more) blocks.

The most straightforward, natural way to implement this stored state in modern languages is with a closure. An initial sketch of a closure-based block scanner is given as block-scanner. Like all lisp development, creating closures is an iterative process. We might start off with code given in block-scanner and decide to improve its efficiency by avoiding coercion of strings to lists, or possibly improve the information gathered by counting the number of occurrences of the sequence.

Although block-scanner is an initial implementation waiting to be improved, it is still a good demonstration of the use of lambda over let over lambda. Here is a demonstration of its use, pretending to be some sort of communications tap watching out for a specific black-listed word, jihad:

* (defvar scanner

    (block-scanner “jihad”))

SCANNER

* (funcall scanner “We will start “)

NIL

# (funcall scanner “the ji”)

NIL

* (funcall scanner “had tomorrow.”)

(let ((direction ‘up))

  (defun toggle-counter-direction ()

    (setq direction

          (if (eq direction ‘up)

            ‘down

            ‘up)))

  (defun counter-class ()

    (let ((counter 0))

      (lambda ()

        (if (eq direction ‘up)

          (incf counter)

          (decf counter))))))

LAMBDA as a renaming operation which has more to do with the internal workings of the compiler (or the interpreter), and with a notation for indicating where quantities are referred to, than with the semantics as such of the computation to be performed by the program..

 An Example: Compiling a Simple Function One of the important consequences of the view of LAMBDA and function calls presented above is that programs written in a style based on the lambda— calculus-theoretic models of higher-level constructs such as DO loops

 Thus , compiler temporaries and simple user variables are treated on a completely equal basis. This idea was used in (Johnsson 75] but without any explanation of why such equal treatment is justified. Here we have some indication that there is conceptually no difference between a user variable and a compiler-generated temporary

 In any case, names are eliminated at compile time, and so by run time the distinction between user names and the compiler ’s generated names has been lost. Thus, at the low level, we may view LAMBDA as a renaming operation which has more to do with the internal workings of the compiler (or the interpreter), and with a notation for indicating where quantities are referred to, than with the semantics as such of the computation to be performed by the program.

                           Furthermore, the ‘access depth’ of a lexical variable is equal to the number of closures which contain it, and in typical programs this depth is small (less than 5). In an optimizing conpiler for lexically scoped LISP it would not necessary to create environment structures in a standard form . Local variables could be kept in any available registers if desired. It would not necessary to interface these environment structures to the interpreter. Because the scoping would be strictly lexical, a reference to a variable in a compiled environment structure must occur in compiled code appearing within the LAMBDA that bound the variable, and so no interpreted reference could refer to such a variable. Similarly, no compiled variable reference could refer to an environment structure created by the interpreter.

This problem can be fixed in any case if the compiler outputs an appropriate map of variable locations for use by the debugger.)

Basic Issues The compiler will need to perform a large amount of global data flow and data type analysis; much of this can be based on the approach used by Wuif in the BLISS-U compiler [Wulf 75), augmented by some general flow-graph analysis scheme. (The BLISS-li flow analysis is not sufficiently general in that it only analyzes single functions, and within a function the only control constructs are conditionals, loops, and block exits.)

https://apps.dtic.mil/sti/tr/pdf/ADA034090.pdf

Conclusion:

LISP and Prolog are indeed Forerunners of Artificial Intelligence Languages. Yet, LISP has some significant differences in Complier vs Interrupters focused topics upon. And Lamda Calculus Functionality gives LISP its trademark in Logical Programming. These were the Key factors discussed in the Study.

References:

https://apps.dtic.mil/sti/tr/pdf/ADA034090.pdf

The post Write up on Tech Geek History: LISP Interupters and Lambda FUNCTION EXPLAINED appeared first on DayDreamin’ Comics.

]]>
https://ddcomics.org/2025/05/03/write-up-on-tech-geek-history-lisp-interupters-and-lambda-function-explained/feed/ 0 5008
Zodiac World: After Tarzac “Book of Podam Nuv” https://ddcomics.org/2025/04/27/zodiac-world-after-tarzac-book-of-podam-nuv/ https://ddcomics.org/2025/04/27/zodiac-world-after-tarzac-book-of-podam-nuv/#respond Sun, 27 Apr 2025 08:19:22 +0000 https://ddcomics.org/?p=5001 Book of Podam Nuv: An Ancient Blood Podam Nuv survived the massacring genocidal actions of Brita Khan . The House of Brita reign was short . Podam Nuv a few countries beyond Caskatta breed a House of Nuv after the Great War. The Leo Pride Ayzens helped Podam Nuv massacre the House of Brita and […]

The post Zodiac World: After Tarzac “Book of Podam Nuv” appeared first on DayDreamin’ Comics.

]]>
Book of Podam Nuv:

An Ancient Blood Podam Nuv survived the massacring genocidal actions of Brita Khan . The House of Brita reign was short . Podam Nuv a few countries beyond Caskatta breed a House of Nuv after the Great War. The Leo Pride Ayzens helped Podam Nuv massacre the House of Brita and the House of Shilords and in 100 years after the Great War purged Caskatta and Kreestonia of the House of Shilords and the House of Brita.

200 years after the House of Brita reign, the House of Nuv allied with Skolora the Sagitarius Nation of Bismet . Podam Nuv reign in Kreestonia and Caskatta was one of a Kuman Doris the Lamb. The Taurus were subjugated to worship the House of Nuv as if the House of Nuv were Gods and offering were demanded each First Male Offspring Bull was to be sacrificed and killed in the Name of Podam Nuv.

The House of Shilords begged for their miserable lives their bourgeois society royal family was at an end. The House of Shilords married under the House of Brita brother of Hodu Khan. Podam Nuv army of Bulls rose and slaughtered their Houses with the aide of the Sagittarius Skolora during his rise to power in Bismet.

Podam Nuv possessed powers of the Demon Garranzana de loco Ground Opal -Blood Coral. Podam Nuv was the General of Hodu Khan and always at his side he absorbed certain essences of the Blood Coral making  Podam Nuv an ancient.

House of Nuv more less a military faction that ruled the various Houses of the Taurus.

His campaign to aide Skolora the Sagittarius Empire in Bismet.  House of Nuv had control over all of Caskatta and Kreestonia and regions of the Ayzams and Boyem Prides of Leos close to the Deserts of Yec regions. Legions of Taurus Bulls marching in formation to and from Kreestonia, Caskatta, the outer regions and into Bismet  dominating all Houses of Taurus .  The Leo Pride Gobizyan , Zy and Otrigans were a triple threat ruled by Emaree the XVII  Leo King .  The  unnamed Land could not be dominated the three Leo Prides that King Cor offspring colonized were to Powerful of Warriors. 

Podam Nuv quest was to retrieve the Ground Opal Blood Coral back in the hands of the Taurus so that the Taurus would have that ultimate power to Rule over the Leo in the Western Hemisphere.  Know that the Virgo Brave Ones stewards over the 12 Ground Opals ; remained guarded in the Fotress of Zirgini it be impossible to March on Zirgini and recapture the Blood Coral.  Reylo the Shinden Roudou tried to invade Zirgini but was stopped by the Virgo Brave Ones and Virgo Forgers.  Podam Nuv sought a way to regain the Blood Coral only if they could seduce a Virgo in betraying the Guild and steal the Blood Coral?  Podam Nuv’s power of Garranzana de loco was of mind control he could control the minds of Taurus Houses why couldn’t he capture a Virgo Brave One and subject a Virgo Brave One to mind control and steal the Blood Coral?

Jungle Kath

Kath the Kuman Demon used Mind Control during the Rage Age to manipulate certain Leo prides , an ancient breed of Leo now extinct descents of the Otrigan Kagouzini Leo Pride did Kath’s bidding under Kath’s mind control to slaughter the Libra Priestess Sector who created the Libra healing pool . This Libra Priestess Sector who extinct were called the Sisters of Ageniz  same blood as Nasira’s witches. This Order of Libra Priestess worked under the True Laws of the Libra Priestess. Kath controlled the Kagouzini to slaughter the Sisters of Ageniz , Polyganda appointed the First Libra Enforcer to slaughter the Kagouzini Leo Pride casted them as Diwers.

The Umtis was forged for the Libra Enforcer by Galloc Muh the Prophet a capable golden sword with certain enchantment that could fair against any Kuman Demon. After the Slaughter of Sisters of Ageniz  -Galloc Muh traveled from Tish to the Hosand land to deliver the Umtis to the First Appointed Libra Enforcer. Tayillah was not the First Libra Enforcer , the First Libra Enforcer was a Guardian of Estmar Priestess named Sha Noc who was mummified in Estmar during the Rage Age. Sha Noc killed all Kagouzini Leo Prides and hunted down all of Nasira’s witches in Kinishi .  Sha Noc death was never recorded inside the Temple of Libra it was only recorded inside of Opicorn the Land of Capicorn.

Podam Nuv pondered in deep thought ; Skolora and the House of Nuv would have to capture a Virgo to seduce her to mind control.  A party of Virgo moved through Bismet to the Hosand Country often. Yet the 12 armies plotted war at this time and staged strategy no one had come to final blows in Battles fear of another Great War.

Podam Nuv hated the Virgo Brave Ones he witnessed the women’s savage ways when they hacked away at his Master Hodu Khan in Midland. Podam Nuv felt that the Virgo Brave Ones were Self Righteous savages who claimed to be appointed by Polyganda to carry out massacres against other Zodiac and Non-Zodiac creatures. Who were the Virgo Brave Ones to judge those that wanted to dominate the World, and these were Great Creatures and Demons, someone had to Rule the Zodiac World it needed a King, a Conqueror to Oversee Domian over the entire Zodiac World.  The Virgo Brave Ones were savages just because they don’t dominate, they were not just in their ways, nasty filthy humanlike creature’s unclean women that took no bathes, cleaned with no oils unlike the Libra human like creatures.  A Taurus bull could smell a Virgo Brave Ones filth miles away.

Podam Nuv feared Emaree VI sons it wasn’t a rumor he knew that one of his Sons were a Prophet . This Leo Prophet party opposed a threat to the House of Nuvs war campaign on Conquering the Unnamed Land where Leos dwelt.    A prophet could destroy the House of Nuv – the House of Shilord & the House of Brita were no more the only ally the Leos could possibly have was the Virgo Brave Ones unaware of Molenda the Terrible  and the Land of the Dead , Estmar were their allies.

Podam Nuv sent Taurus into Che to place them under mind control to gain allies for his war campaign against the Zirgini and stealing the Blood Coral.

The Grandi Phi can easily be manipulated or hired for war campaigns the ape like creatures are as filthy and savage as the human like Virgo that bathe only in a years time.  The Grandi Phi after the Great War remained silent in Che what if Podam Nuv could sway them in fighting the Virgo Brave ones the Grandi Phi would be powerful allies in the Taurus Campaign.

The post Zodiac World: After Tarzac “Book of Podam Nuv” appeared first on DayDreamin’ Comics.

]]>
https://ddcomics.org/2025/04/27/zodiac-world-after-tarzac-book-of-podam-nuv/feed/ 0 5001
Write up on Discrete Mathmathics in an educational Curriculum for grade school and high school students https://ddcomics.org/2025/04/22/write-up-on-discrete-mathmathics-in-an-educational-curriculum-for-grade-school-and-high-school-students/ https://ddcomics.org/2025/04/22/write-up-on-discrete-mathmathics-in-an-educational-curriculum-for-grade-school-and-high-school-students/#respond Tue, 22 Apr 2025 13:20:42 +0000 https://ddcomics.org/?p=4501 Literature Review1.1 Discrete Mathematics used for Computer Science as a Fundamental basics to learn AlgorithmsThe Need for Computer ScienceThis is largely based on how exposed students are to computational thinking and computer science concepts. Additionally, educating students in computer science is beneficial for all students. With the digital age rising, there is a need to […]

The post Write up on Discrete Mathmathics in an educational Curriculum for grade school and high school students appeared first on DayDreamin’ Comics.

]]>
Literature Review
1.1 Discrete Mathematics used for Computer Science as a Fundamental basics to learn Algorithms
The Need for Computer Science
This is largely based on how exposed students are to computational thinking and computer science concepts. Additionally, educating students in computer science is beneficial for all students. With the digital age rising, there is a need to develop logical thinking and problem-solving which are all a part of learning computer science.
Computer Science Standards and Model Curriculum give students experiences that help them discover and take part in a world continually influenced by technology and to understand the role of computing
What is Discrete Mathematics?
Discrete Mathematics is an area of mathematics that most closely connects with the field of computer science. It is the study of mathematical structures that are countable or otherwise distinct and separable (as opposed to continuous quantities like in algebra or calculus).

What Is Discrete Mathematics?
Discrete Mathematics is a rapidly growing and increasingly used area of mathematics, with many practical and relevant applications.
• Because it is grounded in real-world problems, discrete mathematics lends itself easily to implementing the recommendations fo the National Council of Teachers of Mathematics (NCTM) standards. (The recently published Standards and Principles for School Mathematics notes that “As an active branch of contemporary mathematics that is widely used in business and industry, discrete mathematics should be an integral part of the school mathematics curriculum.”)
• Because many discrete math problems are simply stated and have few mathematical prerequisites, they can be introduced at all grade levels, even with children who are not yet fluent readers.
Discrete mathematics will make math concepts come alive for your students. It’s an excellent tool for improving reasoning and problem-solving skills, and is appropriate for students at all levels and of all abilities. Teachers have found that discrete mathematics offers a way of motivating unmotivated students while challenging talented students at the same time.
Because many discrete math problems are simply stated and have few mathematical prerequisites, they can be easily be introduced at the middle school grade level.

1.2 How Discrete Mathematics Can Help Students
The National Council of Teachers of Mathematics (NCTM) recommends that discrete mathematics be implemented into the curriculum as early as the seventh 4 grade, because it benefits students and helps maintain their interest in mathematics [5, p. 362]. But beyond what the NCTM recommends, is discrete mathematics really advantageous to students, and if so, why? Discussed below are some of the reasons. First, it keeps students interested in mathematics. It helps entice them to regularly attend and participate in class. When students are interested in the material, it is easier for them to learn and stay focused when presented with tough, complex problems. While solving problems in discrete mathematics can be complicated, the problems themselves can be easily understood. The students, therefore, are able to understand and work the problems, which gives them a much needed confidence [12, pp. 35-36].

 Many students are lost from mathematics forever during high school. Discrete mathematics is a great way to help these students stay interested and involved in mathematics. Second, discrete mathematics benefits students by allowing them to see the connections between the mathematics they are studying and the real world. “For example, we might be able to convince our students that calculus can be used to help civil engineers build better bridges, but the students still might not see how it really works. But in graph theory [and other areas of discrete mathematics], we can explain the applications, the students can see how they work, and they can actually see real problems” [7, p. 94]. Teachers need to help students dismiss the idea that there is nothing new left to discover in mathematics and help them to look beyond basic arithmetic computation.

 Discrete mathematics is the mathematical foundation of computer science and is “used extensively in business, industry, and government. For example, difference equations are an essential mathematical tool for high-technology engineering firms, and matrices are indispensable for computer graphics” [4, p. 75].

 Another benefit of discrete mathematics is that it enriches the traditional curriculum. It places more emphasis on teaching students to think mathematically and less emphasis on certain computational skills [1, p. 83]. Discrete mathematics lends itself to group work more easily than does traditional mathematics. It is also helpful to teachers because it gives them a new way of teaching elements in the curriculum, which may make the traditional concepts easier to teach and learn.

By using discrete mathematics to teach already existing elements in the curriculum, it can help to change the way students view mathematics altogether. Below are some of the ways that discrete mathematics complements topics already in the traditional secondary-school curriculum: · Algebraic skills are needed and reinforced throughout discrete mathematics. · In geometry, graph theory can be used to enrich the study of polygons and polyhedral. · Difference equations give use to the fascinating new geometry of fractals [4, p. 75]. The NCTM does not provide teachers with detailed guidelines. They only provide a set of goals and topics to cover in high school for discrete mathematics. Therefore, it is up to each individual teacher, or the mathematics department within each school, to decide how these topics should be implemented.


Unfortunately, many teachers are unfamiliar, and even uncomfortable, with discrete mathematics. Thus, it can be difficult for them to know how to incorporate these topics into the curriculum. Because discrete mathematics can be used to teach traditional elements in the curriculum, these topics can be covered in different ways throughout the school year, without having to set aside extra time to cover them. 6 While the implementation of discrete mathematics into the curriculum is not discussed here in detail, many references cited in this thesis give numerous ideas on how to do so. Some also give sample lessons and projects for different skill levels. Some excellent resources are: · DIMACS Series in Discrete Mathematics and Theoretical Computer Science 36 (eds. J.G. Rosenstein, D.S. Franzblau, and F.S. Roberts), American Mathematical Society; 1997. · Discrete Mathematics Across the Curriculum, K–12 (eds. M.J. Kenney, and C.R. Hirsch), NCTM, Inc, Reston, Virginia; 1991. · Mathematics Teacher, a monthly journal magazine.

https://repository.lsu.edu


These political battles over the mathematics curriculum resulted in discrete mathematics largely being ignored in these countries. Of the discrete mathematics topics specifed above, very few are part of the standard curriculum in most of the countries we are familiar with. Through personal communication, it appears that:

  • Combinatorics is included in the secondary curriculum of several countries, including Spain, US, England, Germany, Hungary, Brazil, Israel.
  • Connecting recursive patterns and sequences with algebraic formulas is taught, to some degree, in Spain, Germany, and the United States.
    • Graph theory is included in Italy and some isolated state curriculum in the US. In England, students focusing on mathematics can take a special track in which they have extensive exposure to discrete mathematics. In many countries, it appears that the opportunities for dealing with discrete mathematics in schools, especially when it goes beyond combinatorics, are often only seen on the level of optional recreational mathematics (Colipan & Liendo, 2022; Gravier & OuvrierBufet, 2022; Greefrath et al., 2022). We wonder if one contributing issue for the lack of discrete topics taught in the schools may be that the term discrete mathematics’ is not well understood. Perhaps, each of the discrete topics mentioned above should be considered individually. For example, fair division algorithms and economic game theory are almost self-explanatory. While combinatorics sounds complicated, counting is clearly important. Instead of using the termgraph theory’ which may be misleading to some, we could talk about vertex-edge graphs or networks, which most people are familiar with. Iteration can be described in terms of simple recursive situations, such as repeatedly folding a piece of paper or compounding of interest, along with its accessibility through the use of spreadsheets. Therefore, it might be more productive to talk about the individual discrete topics than the discipline as a whole. This is also intended to describe the mentioned topic areas of discrete mathematics for school more clearly once again. We therefore shortly go into a little more detail on the most common discrete topics and how they may support mathematical competencies.


Reference:
https://repository.lsu.edu/
https://link.springer.com/article/10.1007/s11858-022-01399-7

1.3  Potential benefits of discrete mathematics topics for mathematics education
We see the potential benefits of teaching discrete mathematical topics in three broad areas, and some of these benefits have been highlighted in existing literature. The first potential benefit is offered by the content, which is accessible and offers interesting and relevant topics for teaching and learning (Anderson et al., 2004; DeBellis & Rosenstein, 2004).

Potential benefits of discrete mathematics topics for mathematics education
The second potential benefit is the learning of mathematics and the acquisition of general mathematical competencies (Coenen et al., 2018; Vorhölter et al., 2019) including afect (Goldin, 2018) that influences the learning of mathematics and the third potential is the relevance of discrete mathematics for living in the modern world (Hart & Martin, 2018; Rosenstein, 2007). In this section, we will discuss general benefts and in Sect. 6, the benefts resulting from specifc discrete mathematics topics.

Accessible topics for teaching and learning As early as the end of the 1980s, there were calls to integrate discrete mathematics into teaching, not only in higher education but also in schools (Dolgos, 1990). Advocates of discrete mathematics have noted that problems in discrete mathematics are relatively accessible, in the sense that a student may be able to understand what a problem is asking or can explore a situation without needing a lot of prior mathematical experience (Anderson et al., 2004; Devaney, 2018; Ferrarello & Mammana, 2018; Rosenstein, 2007). This is often because the problems themselves do not require knowledge of technical definitions or specific mathematical knowledge, and students can exemplify and explore objects.

The discrete nature of the objects would seem to lend itself to this accessibility. This accessibility of discrete mathematics is something that seems to be agreed upon by many mathematicians, mathematics educators and mathematics education researchers, and it is often used as an argument for the importance of the inclusion of discrete mathematics in curriculum (Anderson et al., 2004; Burghes, 1995; Dolgos, 1990; Hart & Martin, 2018). While we note that this is an aspect of discrete mathematics that would benefit from more systematic study and research, this accessibility has come through in some research studies, but not as an explicit focus of the study. Some of the research on the teaching and learning of discrete mathematics with younger students highlights not only the accessibility of topics but that this accessibility can help students make sense of the current curriculum.

 For example, iterative problems and difference equations can help students learn algebra (Amit & Neria, 2008; Blanton & Kaput, 2005; Carraher et al., 2008; Radford, 2008; Rivera & Becker, 2008; Sandefur et al., 2018; Steele, 2008; Yeap & Kaur, 2008). Even very young students can reason about combinatorial problems in meaningful ways (de Beer et al., 2015; Maher et al., 2011). English (1991, 1993) reports on young children’s strategies as they engage with combinatorial problems. As another example, students can naturally `invent’ graph theory to solve a problem (Ferrarello & Mammana, 2018; Greefrath et al., 2022; van den Heuvel & Krabbendam, 1991). We can only wonder how much better would the students’ work be if they already knew some graph theory or had previous experience with counting or recursive problems?


For many topics in discrete mathematics, students ranging from young children to undergraduate students can be posed similar questions and have a reasonable chance at investigating the problem at their different levels. This results in self differentiating tasks that allow individual approaches to the problem (Ostkirchen & Greefrath, 2022). For example, how many 2-color towers can I make of height 5, can be extended to more complicated problems for older students by increasing the number of colors and the height of the tower. Maher et al. (2011) describe the use of combinatorial problems in such contexts among students in a longitudinal study. Students as young as the third grade can investigate recursive structures they build with toothpicks and stickers while high school students can develop recursive models of bacteria growth and the spread of epidemics, which is a simplified version of models studied by epidemiologists (Radford, 2008; Sandefur & Manaster, 2022; Yeap & Kaur, 2008).

https://link.springer.com/article/10.1007/s11858-022-01399-7
Conclusion:
While we note that this is an aspect of discrete mathematics that would benefit from more systematic study and research, this accessibility has come through in some research studies, but not as an explicit focus of the study. Some of the research on the teaching and learning of discrete mathematics with younger students highlights not only the accessibility of topics but that this accessibility can help students make sense of the current curriculum. For example, iterative problems and difference equations can help students learn algebra (Amit & Neria, 2008; Blanton & Kaput, 2005; Carraher et al., 2008; Radford, 2008; Rivera & Becker, 2008; Sandefur et al., 2018; Steele, 2008; Yeap & Kaur, 2008). Even very young students can reason about combinatorial problems in meaningful ways (de Beer et al., 2015; Maher et al., 2011). English (1991, 1993) reports on young children’s strategies as they engage with combinatorial problems. As another example, students can naturally `invent’ graph theory to solve a problem (Ferrarello & Mammana, 2018; Greefrath et al., 2022; van den Heuvel & Krabbendam, 1991).

We can only wonder how much better would the students’ work be if they already knew some graph theory or had previous experience with counting or recursive problems? For many topics in discrete mathematics, students ranging from young children to undergraduate students can be posed similar questions and have a reasonable chance at Investigating the problem at their different levels.

This results in self differentiating tasks that allow individual approaches to the problem (Ostkirchen & Greefrath, 2022). For example, how many 2-color towers can I make of height 5, can be extended to more complicated problems for older students by increasing the number of colors and the height of the tower. Maher et al. (2011) describe the use of combinatorial problems in such contexts among students in a longitudinal study. Students as young as the third grade can investigate recursive structures they build with toothpicks and stickers while high school students can develop recursive models of bacteria growth and the spread of epidemics, which is a simplified version of models studied by epidemiologists (Radford, 2008; Sandefur & Manaster, 2022; Yeap & Kaur, 2008).

This highlights what we mean by accessibility – students can have access to mathematical topics and ideas regardless of background and prerequisite knowledge (DeBellis & Rosenstein, 2004; Ferrarello & Mammana, 2018). Although we have several examples of empirical research that implicitly demonstrates the accessibility of discrete mathematics and the value of this accessibility, we note that there is also more work to be done. There is a need for the field to focus on the issue of accessibility more systematically and explicitly.

The post Write up on Discrete Mathmathics in an educational Curriculum for grade school and high school students appeared first on DayDreamin’ Comics.

]]>
https://ddcomics.org/2025/04/22/write-up-on-discrete-mathmathics-in-an-educational-curriculum-for-grade-school-and-high-school-students/feed/ 0 4501
Write up on Tech Geek History: MS DOS Gaming https://ddcomics.org/2025/04/21/write-up-on-tech-geek-history-ms-dos-gaming/ https://ddcomics.org/2025/04/21/write-up-on-tech-geek-history-ms-dos-gaming/#respond Mon, 21 Apr 2025 09:57:40 +0000 https://ddcomics.org/?p=4970 Literature ReviewHistory of DOS GamesDOS (an abbreviation of Disk Operating System “Disk Operating System” or “Operating System Disk”) is a family of operating systems for personal computers (PC). Created for computers of the IBM PC family, they used the 16-bit Intel 8086 and 8088 processors, being the first popular operating system for this platform. It […]

The post Write up on Tech Geek History: MS DOS Gaming appeared first on DayDreamin’ Comics.

]]>
Literature Review
History of DOS Games
DOS (an abbreviation of Disk Operating System “Disk Operating System” or “Operating System Disk”) is a family of operating systems for personal computers (PC). Created for computers of the IBM PC family, they used the 16-bit Intel 8086 and 8088 processors, being the first popular operating system for this platform. It had a command-line interface in text mode or alphanumeric, via its shell, command.com. Probably the most popular of its variants is the belonging to the family MS-DOS, Microsoft, supplied with a good part of the computers compatible with the IBM PC, in particular, those of the family of Intel, as a separate operating system or native, up to version 6.22, often attached to a version of the graphical interface of 16-bit Windows, such as 3.1 x.
Inversions native Microsoft Windows based on NT (and this in turn in OS/2 2.X) (see Windows NT, 2000, 2003, XP or Vista or Windows 7) MS-DOS disappears as operating system (proper) and base environment, from which the computer and its essential processes were started and the windows graphical interface or working environment was run and loaded. Any vestige of the same is relegated, in such versions, to the existence of a simple shell, called System symbol, executed as an application using cmd.exe, from the realistic environment itself (now elevated to the system category).
This is not true for non-native Windows versions, which are MS-DOS-based, and are loaded from it. From 1.0 x to 3.1(1), 16-bit versions, Ms. Windows had the idea of a simple interface application or graphical environment, complementary to the shell itself, from which it was executed. It was from the 32-bit, new design, and higher power versions, based on Windows 95 and 98, that the MS-DOS began to be deliberately camouflaged by the windows graphic environment itself. During the boot process, it is giving way, by default, to its automatic execution, which caught the attention of the average user and attributed to the old system a more dependent and secondary role, becoming by many forgotten and unknown. Gradually abandoned by the software and hardware developers., starting with Microsoft itself (this option can be disabled by altering the BootGUI=1 entry by BootGUI=0, from the system file, now text, MSDOS. SYS). However, in such versions, Windows did not function autonomously, as an operating system. Several of the primary or essential functions of the system and their boot are still due to the 32-bit versions, to the different modules and system files that made up the modest frame of the DOS, requiring those a minimum of the underlying records of the DOS, in order to be run (such as IO.SYS, DRVSPACE. BIN, EMM386.EXE and HIMEM. SYS).
There are several versions of DOS:
MS-DOS, Microsoft, is the most well-known.
PC-DOS, IBM.
DR-DOS, from Digital Research, would then move to Novell (Novell DOS 7.0), then to Caldera and finally to DeviceLogics.
FreeDOS is the most recent, free license and open source. You can do the version for GNU/Linux and UNIX, of an emulator of MS-DOS under systems of this type.
With the appearance of the operating systems with graphical user interface (GUI), of the Windows type, especially those of 32 bits, of the Windows 95 type, the DOS has been relegated to the background, until being reduced to the mere shell of commands, and to the command lines (especially in type files .PIF and .BAT), as in Windows NT derivative systems.
History
The story of DOS games started in 1981 when a purchase was made, on the part of Microsoft, the operating system, QDOS (Quick and Dirty Operating System), that after receiving a few modifications, become the first version of the Microsoft operating system, called MS-DOS 1.0 (Microsoft Disk Operating System).
From here, there are a series of modifications to the operating system, until you get to version 7.1, from which MS-DOS ceases to exist as such and becomes an integrated part of the Microsoft Windows operating system.
MS-DOS chronology in all versions
In 1982, version 1.25 was released, and support for double-sided diskettes was added.
In 1983, the system began to have more functionality, with its version 2.0, which added support to IBM 10 MB hard drives, and the ability to read-write 5¼” floppy disks with a capacity of 360 Kb. In version 2.11 of the same year, new keyboard characters are added.
In 1984, Microsoft would release its MS-DOS 3.0 version, and that’s when support for 1.2 MB high-density disks and the possibility of installing a hard drive with a maximum of 32 MB is added. In the same year, support for Microsoft networks would be added to version 3.1.
Three years later, in 1987, version 3.3 is released with support for 3½” floppy disks, and it is allowed to use hard drives more significant than 32 MB.
In 1988, Microsoft released its version 4.0 and with it the support for extended memory specification (XMS) and the possibility to include hard drives up to 2 GB, it should be noted that this version was the biggest catastrophe carried out by the company because it was full of bugs, bugs, etc., which they fixed in 1989 with the release of version 4.01 that solved all these problems and failures.
In 1991, one of the most relevant developments in MS-DOS history is the transition from version 4.01 to version 5.0, in which DOS is already able to load programs into the high memory part of the system using the upper memory (from 640 Kb to 1024 Kb). In version 5.0, the basic programmer and the famous EDIT editor are added. We also added the utilities UNDELETE (recovery of deleted files), FDISK (partition management), and service to run programs designed for earlier versions of MS-DOS, called SERVER. At the end of 1992 was resolved a few problems with UNDELETE and CHKDSK on the 5.0 release.
In 1993, MS-DOS 6.0 appeared with many new features, among them the Doublespace utility that was responsible for compressing the disk and thus having more space available, also included a basic antivirus (MSAV), a DEFRAGMENTADOR (DEFRAG), a memory administrator (MEMMAKER) and some old utilities were suppressed, which by misusing them could destroy data, these utilities were JOIN and RECOVER, among others. In the same year, version 6.2, which adds safety to the loss of data Doublespace, and adds a new scanner, disk, SCANDISK, and solves problems with DISKCOPY and SmartDrive. In version 6.21, which appeared in 1993, Microsoft suppresses Doublespace and looks for a new alternative for this utility.
In 1994, the solution to the Doublespace problem appeared was the utility of the company Stac Electronics, Drive space, the one chosen to be included in version 6.22.
In 1995 Microsoft Windows 95 appeared, and with the appearance of the same, means to separate MS-DOS to a secondary plane.
The MS-DOS system, however, remains in 1995 a new version, 7.0, which correct a multitude of utilities and provides support for long names. Deleted services from the previous operating system can be found in the Windows 95 \other\oldmsdos CD directory.
In 1997 Windows 95 OSR2 appeared and with it a comprehensive revision of system DOS, adding support for FAT32 partitions. Since then, MS-DOS ceases to exist as an operating system.
DOS versions
Several companies developed versions of DOS, generally very similar to each other. PC-DOS and MS-DOS, for example, began to be virtually identical, although they ended up being very different. Versions most well-known are QDOS, PC-DOS, MS-DOS, and FreeDOS, among others.
With the GNU / Linux operating system, it is possible to run two copies under DOSEmu, a virtual machine native to GNU/Linux to run programs in real mode. There are many other emulators for different versions of UNIX, even for platforms other than the x86 processor architecture.
https://dosomegames.com/history-of-dos-games/

When we talk about “DOS Games” we speak about games produced for PC running a Microsoft system prior to Windows. The first “PC” was the IBM PC introduced in 1981. This means that the PC we know today did not exist during the 1st generation of consoles. However, the IBM PC could play games written for mainframe computers in portable programming languages that existed before the PC was born. Zork was written in Z-code in 1977, Lunar Lander was ported to BASIC in 1973 and Star Trek is dated back to 1971.

Incidentally most games for MS-DOS in 1981-1983 were ports from other systems like TRS-80, Apple II and Commodore 64 and and those who were DOS-Specific were often published by IBM themselves like Arithmetic Games Set 1 and 2 that might have been the first games written and published directly for DOS in mind.

While the IBM PC could display graphics, graphics was barely used in the first batch of PC games that instead relied on text, unless they used very rudimentary line-based 3d-polygons without color or textures. Even the first action-games, such as Snipes, used letters instead of pixels, both for the character and enemies. The trend of games lagging behind on graphics will stay through most of the early DOS history and its rooted in the fact that the raw processing power and memory limited what the PC could do.

The second generation of video game consoles brought rudimentary colors and interchangeable software. The IBM PC coexisted the final years of the most iconic of the 2nd generation consoles; the Atari 2600. This was also the same era where games like Pac-Man, Space Invaders and Donkey Kong could be played in the Arcades.

The earliest games with graphics appeared around 1982, with Paratrooper, Flight Simulator 1.0 and Decathlon. It took until 83-84 for CGA graphics to be common. CGA is identified by a distinct 4-color palette. The lack of color made gaming on the PC inferior to contemporary platforms like the Commodore 64, the ZX Spectrum and Amstrad CPC. Even if other alternatives became available earlier on, the majority of all DOS games kept using CGA until 1987.

Harddrives and memory capacity was limited too. To save space, many of the first games were booted from large wobbly 5-inch floppy disks, called “PC booters”. With few standards the games in this era were pioneers, often hardcoded or custom made. This make them difficult to run even on authentic PC’s. One issue were that they were programmed to run as fast as the processor can handle, meaning that when processors became faster the games became too fast to be played until modern emulation came in. Sound and music was often non-existant or used the “PC speaker” . A rudimentary device that could produce simple bleeps and blops.

What is Hercules?
The Hercules Graphics Card was released in 1982 and offered high resolution (720×348) monochrome graphics. For awhile it was standard on monochrome IBM computers. This card was rarely a primary choice for games, but mentioned here as a curiosity.
1983 marks the video game crash, a time in which home computers took over the gaming market. While the new IBM XT was a more powerful machine, with an updated 286 processor, it was also expensive. The IBM PCjr was announced in 1984 to compete with Commodore 64 and Apple II, but it also met competition with the “PC Compatible” Tandy 1000 by Tandy Corporation. The Tandy 1000 marked the first step towards IBM losing their hold of PC as a platform, leading to PC becoming an “unowned” computer.

What is Composite CGA?
During this era we saw the earliest introduction of 16 colors on PC. When using CGA on some old TV’s, the signal was imperfect, which caused a color smearing that was later turned into an asset. Done right it was possible to use this smearing to produce new colors, offering an early 16-color mode known as “Composite CGA”. 1983 marks the video game crash, a time in which home computers took over the gaming market. While the new IBM XT was a more powerful machine, with an updated 286 processor, it was also expensive. The IBM PCjr was announced in 1984 to compete with Commodore 64 and Apple II, but it also met competition with the “PC Compatible” Tandy 1000 by Tandy Corporation. The Tandy 1000 marked the first step towards IBM losing their hold of PC as a platform, leading to PC becoming an “unowned” computer.

What is Composite CGA?
During this era we saw the earliest introduction of 16 colors on PC. When using CGA on some old TV’s, the signal was imperfect, which caused a color smearing that was later turned into an asset. Done right it was possible to use this smearing to produce new colors, offering an early 16-color mode known as “Composite CGA”.

What is Tandy?
King’s Quest was among the first games to use the low resolution 16-color PCjr Tandy mode, a mode iconic for its very large pixels. By reducing the amount of pixels on screen (160×200), the PC’s could produce 16-color games at reasonable speed. Adventure games like King’s Quest could not be ran on most other systems at the time due to their high memory requirement, making King’s Quest one of the first “defining” games for DOS and still quite fun to play.
DOS Memory Management
Throughout the DOS era, one of the most challenging and frustrating things was making sure applications and games had the right memory configuration. The problem stemmed from limitations in the original IBM PC’s architecture, where it was thought no PC would ever require more than 640 KB of RAM!
Indeed, the Intel 8088 and 8086 CPUs could only physically access up to 1 MB of memory via their 20 address lines. With the arrival of the 80286 CPU, up to 16 MB could be addressed, but in order to retain full backward-compatibility with the original IBM PC, memory allocation was still limited to the first 640 KB – this was referred to as Conventional Memory or Base Memory.
Upper Memory
In the original IBM PC architecture the area of memory between 640 KB and 1 MB was called Upper Memory. This was supposed to be reserved for a combination of video screen memory, video BIOS memory, option ROMs for certain devices, and Cassette BASIC. In reality, a lot of this 384 KB upper memory area (UMA) was unused.
From MS-DOS 5.0, launched in June 1991, device drivers and TSRs could be loaded into unused locations within the 384 KB of UMA via the loading of EMM386.EXE (a device driver that opened up access to the UMA). This helped keep conventional memory free for running programs. These locations were called Upper Memory Blocks (UMBs).
Extended Memory and the High Memory Area
All memory above 1 MB was referred to generically as Extended Memory. Within this, a small 64 KB area just above the 1 MB mark is called the High Memory Area (HMA).
Again from MS-DOS 5.0, a new device driver was provided called HIMEM.SYS which would allow parts of the operating system to be loaded into the HMA. This meant that up to 46 KB of conventional memory could be freed up for programs instead of storing part of the operating system.
On 80286-based systems and above, CPUs would need to be put into what was called “Protected” mode in order to access this Extended Memory. The default mode on startup for 286 and higher processors was called “Real” mode, which was essentially the same as the only mode the 8088 and 8086 CPUs could run in.
Expanded Memory
Due to the fact that no 100% IBM PC-compatible DOS software could support the 286’s Protected mode, there was an opportunity for some other mechanism to be created in order to provide access to memory above 1 MB.
The solution was to have the ability to move a “window” of accessible memory around the extended memory space in what was known as bank switching. By swapping out chunks of the extended memory area (everything above 1 MB) into a 64 KB region of the UMA, the full amount of extended memory could be accessed, just one chunk at a time. This method of accessing more memory grew and eventually became a standard known as LIM EMS (Lotus/Intel/Microsoft Expanded Memory Specification), named after the consortium of companies that worked on and ratified the specification.
It was at this point where Extended Memory got the label XMS, and Expanded Memory got the label EMS to help differentiate between the two. Both access memory above the 1 MB mark, but do so in different ways.
In order to make use of EMS, DOS 4.01 (released in 1989) came bundled with an Expanded Memory Manager called EMM386.SYS. In 1991 a more flexible version called EMM386.EXE was released with DOS 5.0. EMM386 made use of a mode found in 80386 CPUs and above: “Virtual 8086” mode.
https://dosdays.co.uk/topics/dos_memory.php
Section II: Programming in the MS-DOS Environment
Part A Structure of MS-DOS

An operating system is a set of interrelated supervisory programs that
manage and control computer processing. In general, an operating
system provides

■ Storage management
■ Processing management
■ Security
■ Human interface

Existing operating systems for microcomputers fall into three major
categories: ROM monitors, traditional operating systems, and operating
environments. The general characteristics of the three categories are
listed in Table 1-1.


Table 1-1. Characteristics of the Three Major Types of
Operating Systems.

╓┌──────────────────────────┌─────────────┌─────────────┌────────────────────╖
Traditional
ROM Operating Operating
Monitor System Environment
──────────────────────────────────────────────────────────────────
Complexity Low Medium High
Built on Hardware BIOS Operating system
Delivered on ROM Disk Disk
Programs on ROM Disk Disk
Peripheral support Physical Logical Logical
Disk access Sector File system File system
Example PC ROM BIOS MS-DOS Microsoft Windows

A ROM monitor is the simplest type of operating system. It is designed
for a particular hardware configuration and provides a program with
basic–and often direct–access to peripherals attached to the
computer. Programs coupled with a ROM monitor are often used for
dedicated applications such as controlling a microwave oven or
controlling the engine of a car.

A traditional microcomputer operating system is built on top of a ROM
monitor, or BIOS (basic input/output system), and provides additional
features such as a file system and logical access to peripherals.
(Logical access to peripherals allows applications to run in a
hardware-independent manner.) A traditional operating system also
stores programs in files on peripheral storage devices and, on
request, loads them into memory for execution. MS-DOS is a traditional
operating system.

An operating environment is built on top of a traditional operating
system. The operating environment provides additional services, such
as common menu and forms support, that simplify program operation and
make the user interface more consistent. Microsoft Windows is an
operating environment.

MS-DOS System Components

The Microsoft Disk Operating System, MS-DOS, is a traditional
microcomputer operating system that consists of five major components:

■  The operating-system loader
■  The MS-DOS BIOS
■  The MS-DOS kernel
■  The user interface (shell)
■  Support programs

Each of these is introduced briefly in the following pages. See
PROGRAMMING IN THE MS-DOS ENVIRONMENT: STRUCTURE OF MS-DOS: The
Components of MS-DOS.

The operating-system loader

The operating-system loader brings the operating system from the
startup disk into RAM.

The complete loading process, called bootstrapping, is often complex,
and multiple loaders may be involved. (The term bootstrapping came
about because each level pulls up the next part of the system, like
pulling up on a pair of bootstraps.) For example, in most standard
MS-DOS-based microcomputer implementations,  the ROM loader, which is
the first program the microcomputer executes when it is turned on or
restarted, reads the disk bootstrap loader from the first (boot)
sector of the startup disk and executes it. The disk bootstrap loader,
in turn, reads the main portions of MS-DOS--MSDOS.SYS and IO.SYS
(IBMDOS.COM and IBMBIO.COM with PC-DOS)--from conventional disk files
into memory. The special module SYSINIT within MSDOS.SYS then
initializes MS-DOS's tables and buffers and discards itself. See
PROGRAMMING IN THE MS-DOS ENVIRONMENT: STRUCTURE OF MS-DOS: MS-DOS
Storage Devices.

(The term loader is also used to refer to the portion of the operating
system that brings application programs into memory for execution.
This loader is different from the ROM loader and the operating-system
loader.)

The MS-DOS BIOS

The MS-DOS BIOS, loaded from the file IO.SYS during system
initialization, is the layer of the operating system that sits between
the operating-system kernel and the hardware. An application performs
input and output by making requests to the operating-system kernel,
which, in turn, calls the MS-DOS BIOS routines that access the
hardware directly. See SYSTEM CALLS. This division of function allows
application programs to be written in a hardware-independent manner.

The MS-DOS BIOS consists of some initialization code and a collection
of device drivers. (A device driver is a specialized program that
provides support for a specific device such as a display or serial
port.) The device drivers are responsible for hardware access and for
the interrupt support that allows the associated devices to signal the
microprocessor that they need service.

The device drivers contained in the file IO.SYS, which are always
loaded during system initialization, are sometimes referred to as the
resident drivers. With MS-DOS versions 2.0 and later, additional
device drivers, called installable drivers, can optionally be loaded
during system initialization as a result of DEVICE directives in the
system's configuration file. 

The MS-DOS kernel

The services provided to application programs by the MS-DOS kernel
include

■  Process control
■  Memory management
■  Peripheral support
■  A file system

The MS-DOS kernel is loaded from the file MSDOS.SYS during system
initialization.

https://www.pcjs.org/documents/books/mspl13/msdos/encyclopedia/section2/c

Conclusion
The MS DOS scalability based on it’s Technical Requirements and Primitive Instructional Sets 86 Assembly was quite impressive in Gaming until 1998 when PlayStation had become dominate in the Gaming Market. Focus point is the Memory Management , again look at the Memory Management it was very impressive for PC Gaming.
Memory management
Because the amount of memory a program needs varies from program to
program, the traditional operating system ordinarily provides memory-
management functions. Memory requirements can also vary during program
execution, and memory management is especially necessary when two or
more programs are present in memory at the same time.

MS-DOS memory management is based on a pool of variable-size memory
blocks. The two basic memory-management actions are to allocate a
block from the pool and to return an allocated block to the pool.
MS-DOS allocates program space from the pool when the program is
loaded; programs themselves can allocate additional memory from the
pool. Many programs perform their own memory management by using a
local memory pool, or heap–an additional memory block allocated from
the operating system that the application program itself divides into
blocks for use by its various routines.

Because the amount of memory a program needs varies from program to
program, the traditional operating system ordinarily provides memory-
management functions. Memory requirements can also vary during program
execution, and memory management is especially necessary when two or
more programs are present in memory at the same time.

References:

https://dosomegames.com/history-of-dos-games

https://dosdays.co.uk/topics/dos_memory.php

https://www.pcjs.org/documents/books/mspl13/msdos/encyclopedia/section2/c

The post Write up on Tech Geek History: MS DOS Gaming appeared first on DayDreamin’ Comics.

]]>
https://ddcomics.org/2025/04/21/write-up-on-tech-geek-history-ms-dos-gaming/feed/ 0 4970
Write up on Tech Geek History Clojure Programming Language https://ddcomics.org/2025/04/19/write-up-on-tech-geek-history-clojure-programming-language/ https://ddcomics.org/2025/04/19/write-up-on-tech-geek-history-clojure-programming-language/#respond Sat, 19 Apr 2025 12:30:09 +0000 https://ddcomics.org/?p=4962 Clojure was designed to be a general-purpose, practical functional language, suitable for use by professionals wherever its host language, e.g., Java, would be. Initially designed in 2005 and released in 2007, Clojure is a dialect of Lisp, but is not a direct descendant of any prior Lisp. It complements programming with pure functions of immutable […]

The post Write up on Tech Geek History Clojure Programming Language appeared first on DayDreamin’ Comics.

]]>
Clojure was designed to be a general-purpose, practical functional language, suitable for use by professionals wherever its host language, e.g., Java, would be. Initially designed in 2005 and released in 2007, Clojure is a dialect of Lisp, but is not a direct descendant of any prior Lisp. It complements programming with pure functions of immutable data with concurrency-safe state management constructs that support writing correct multithreaded programs without the complexity of mutex locks. Clojure is intentionally hosted, in that it compiles to and runs on the runtime of another language, such as the JVM. This is more than an implementation strategy; numerous features ensure that programs written in Clojure can leverage and interoperate with the libraries of the host language directly and efficiently. In spite of combining two(at the time) rather unpopular ideas, functional programming and Lisp, Clojure has since seen adoption in industries as diverse as finance, climate science, retail, databases, analytics, publishing, healthcare, advertising and genomics, and by consultancies and startups worldwide, much tothecareer-altering surprise of its author. Most of the ideas in Clojure were not novel, but their combination puts Clojure in a unique spot in language design (functional, hosted, Lisp). This paper recounts the motivation behind the initial development of Clojure and the rationale for various design decisions and language constructs. It then covers its evolution subsequent to release and adoption.

is a Lisp, but what does that mean? Lisp is a fascinating set of ideas, a family of languages without a monotonic lineage [Steele and Gabriel 1996]. There are some shared characteristics, all of which I considered positive attributes to retain for Clojure: code is data; independent read/print; small core; runtime tangibility; the REPL; and extreme flexibility. 3.1.1 Code is Data. A Lisp program is defined in terms of the interpretation of its core data structures, rather than by a syntax over characters. This makes it easy for programs to be a source of programs and for program transformations to be functions of data → data, and in both cases for the standard library to be of substantial utility. The conversion of character streams into data is handled by separate functions of the reader. While much is made of these facilities as a recipe for syntactic abstraction (e.g., macros), syntactic abstraction via code-is-data is just a single exemplar of the value of defining any process as functions of data → data wherein the standard data structures and library are of significant utility and reusability. This is in stark contrast to the common tendency to design a bespoke interface and types for every problem

Lisp Choices Clojure never intended compatibility with a predecessor Lisp like Scheme or Common Lisp, which left me with the task of deciding which way to go on several core Lisp decision points. 3.2.1 Lisp-1 and Macros. Clojure uses a single resolution mechanism for symbols in the function position and elsewhere, and is thus a Lisp-1 [Gabriel and Pitman 1988]. This is strictly less complex than Lisp-2, more conducive to programming with higher-order functions, less context dependent etc. The only exceptions to this are some of the symbols designating host interop accepted only in the function position, for which there are no meaningful corresponding values. However, Clojure supports programmatic macros (arbitrary functions of data → data, such data including symbols) in the Common Lisp style, which has been considered to be problematic Proc. ACM Program. Lang., Vol. 4, No. HOPL, Article 71. Publication date: June 2020. 71:8 Rich Hickey without the separate function space of Lisp-2. I concluded that in Common Lisp the conflation of symbols and storage locations, and the interning reader, were the sources of the conflict. The interning reader is particularly problematic; it creates a stateful interaction between reading and the runtime environment, breaking the otherwise functional nature of code-text → data-structures. By manipulating the environment, the interning reader restricts and interferes with the macro system’s ability to control evaluation. In Clojure, symbols are a simple immutable type akin to strings, with no storage. While symbols have two parts, an optional ‘namespace’ part and a ‘name’ part, they are not inherently interned in packages/namespaces. During read there is no interning nor resolution of symbols. The resolution of symbols to vars (Clojure’s separate storage location type) generally happens during compilation. Asecond place where resolution of symbols occurs is in Clojure’s version of quasiquote, called syntax-quote and designated by ‘`’. Syntax-quote will take a form containing symbols and replace any unqualified symbol (i.e. one without a namespace part) with a fully-qualified one, where the namespace portion corresponds to the mapping in the namespace where syntax-quote was called. Thus a macro’s use of the symbol rest (a Clojure core function) within a syntax-quote will be replaced with clojure.core/rest and will be free of conflict when that macro is expanded in a context with a different or local binding for rest. If one wants to introduce conflict-free local names Clojure has gensym. Taken together, this has worked out to be a quite satisfactory recipe for avoiding the so-called “hygiene problem” [Kohlbecker et al. 1986] 3.2.2 Reader Macros. One thing conspicuously missing from Clojure are Common Lisp’s reader macros. While they fully empower the user to create a language of their own specification, such languages are islands. Critically, they require the presence of specific code to read particular data, such requirement being in direct conflict with some of the benefits of independent read/print enumerated above. I saw reader macros in the CL style as being in direct conflict with library development, interoperability, Clojure data (edn) as a wire format etc. I am certain that had Clojure had reader macros, and users availed themselves of them, the large, composable, data-driven library ecosystem that arose around Clojure would have been compromised or thwarted. I am not opposed to extensibility, and added it to Clojure’s data format with its christening as edn (the e stands for extensible) in the 1.4 release in 2012, described in section 4.5. 3.2.3 Tail Calls and Recursion. I very much would have liked to copy Scheme’s ‘proper tail recur sion’ [Steele Jr and Sussman 1978] and the elegant programming style it supports, but the JVM does not allow for that stack management approach in any practical way. On the other hand, I consider partial tail call optimization, e.g., of self-calls but not mutually recursive calls, to be a semantic non-feature. In addition, even with proper tail recursion, I thought it may be a point of confusion among users when exactly a call is in tail position and subject to the optimization. Thus, while supporting recursive and mutually recursive function calls (without Scheme’s unbounded promise), Clojure offers a limited but explicit looping recursion construct called recur and an accompanying binding/scope construct called loop. recur takes arguments matching the bindings in the enclosing loop, or the function head if no enclosing loop.

CoreDifferences Setting aside being hosted, the above differences with other Lisps were, I thought, insufficient to justify making another Lisp dialect from scratch vs building one atop Scheme or Common Lisp. There are several key areas where Clojure differs at its core from Scheme and Common Lisp and thereby justifies its existence. 3.3.1 Abstractions at the Bottom. Due to their history and heritage, Lisps prior to Clojure, and their standard libraries, have been built on concretions: primarily the mutable cons cell and lists constructed thereupon. While one can’t fault the choice during the early days of Lisp, we now have sufficient technology (high performance runtime polymorphic dispatch, thanks OO!) to support different choices about what should be at the bottom. One positive aspect of years of OO programming is that it left me with a strong aversion to defining libraries in terms of concretions. I simply couldn’t imagine choosing a cons cell with mutable car and cdr as the basis for a language or library in 2005, and so I did not. It was my objective to tweak Perlis [1982] “It is better to have 100 functions operate on one data structure than to have 10 functions operate on 10 data structures.” with “It is better to have 100 functions operate on one data abstraction than to have 10 functions operate on 10 data structures.” For Clojure I built several such abstractions underlying its standard library covering sequentiality, collections, keyed access, etc. The abstraction replacing the cons cell is seq.

https://dl.acm.org/doi/pdf/10.1145/3386321

The post Write up on Tech Geek History Clojure Programming Language appeared first on DayDreamin’ Comics.

]]>
https://ddcomics.org/2025/04/19/write-up-on-tech-geek-history-clojure-programming-language/feed/ 0 4962