Внимательно прочитайте документацию proc
: каждый из аргументов в списке аргументов сам является списком, который должен иметь 1 или 2 элемента: обязательное имя аргумента и необязательное значение по умолчанию,"number of people"
имеет слишком много элементов.Вы можете получить то, что хотите, с помощью еще одного слоя фигурных скобок:
% proc "bake a cake" {{"for people"} {"and children"}} {
puts "baking a cake for [set {for people}] people and [set {and children}] children"
}
% "bake a cake" 1 2
baking a cake for 1 people and 2 children
% "bake a cake"
wrong # args: should be "{bake a cake} {for people} {and children}"
Я не вижу выгоды от проведения этого эксперимента: неуклюжие имена переменных исключают синтаксический сахар $
.
Обратите внимание, что не так сложно получить код, похожий на Smalltalk
% proc bakeACake {forPeople: nPeople andChildren: nChildren} {
if {[set forPeople:] ne "forPeople:" || [set andChildren:] ne "andChildren:"} {
error {should be "bakeACake forPeople: nPeople andChildren: nChildren"}
}
puts "baking a cake for $nPeople people and $nChildren children"
}
% bakeACake
wrong # args: should be "bakeACake forPeople: nPeople andChildren: nChildren"
% bakeACake foo 1 bar 2
should be "bakeACake forPeople: nPeople andChildren: nChildren"
% bakeACake forPeople: 3 andChildren: 4
baking a cake for 3 people and 4 children
Хотя в отличие от Smalltalk, у вас не может быть других команд, начинающихся с "bakeACake" (если только вы не копаетесь в "ансамблях пространства имен")